准备整理一下知识点了,之前说要刷kuangbin的提单(全绿)结果dp还没写完。先把牛客的比赛补一补吧,不想签到了。
B 括号
找规律的题,一开始想的是一个左括号,其余右括号,有个数限制。所以拆成 a 个左括号,b 个右括号,但是需要 ab=k,有些k不能拆成 (a+b<=1e5) 满足条件的 a 和 b ,所以先对 k -> sqrt(k),向下取整,然后做除做余,余表示 m—m=k-ab ,放到最左边,然后加一个右括号匹配,再放 a-m个 左括号,再放 b 个右括号—(a-m)b+mb 完成匹配。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
const int mod=1e9+7;
typedef long long ll;
ll k;
int main(){
cin>>k;
if(k==0){
cout<<")(";
return 0;
}
ll p=sqrt(k);
ll r=k/p;
ll l=k%p;
for(int i=0;i<l;i++) cout<<"(";
cout<<")";
for(int i=l;i<p;i++) cout<<"(";
for(int i=0;i<r;i++) cout<<")";
return 0;
}
I 限制不互素对的排列
赛中想到了,写了个寂寞,先分奇数偶数,偶数gcd一定不唯一(都能被2整除)然后还可以加两个值,就挑最小的3—6,5—10两对,放在两边。最后按需构造就好了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int f[maxn];
int vis[maxn];
int main(){
int n,k;
cin>>n>>k;
if(n<=5&&k==n/2) cout<<-1;
else{
vector<int> ve;
if(k==n/2){
for(int i=2;i<=n;i+=2){
if(i==6) continue;
ve.push_back(i);
}
ve.push_back(6);
ve.push_back(3);
for(int i=1;i<=n;i+=2){
if(i==3) continue;
ve.push_back(i);
}
}else{
for(int i=2;i<=2*k+2;i+=2){
ve.push_back(i);
}
for(int i=1;i<=2*k+2;i+=2){
ve.push_back(i);
}
for(int i=2*k+3;i<=n;i++){
ve.push_back(i);
}
}
for(int i=0;i<ve.size();i++){
cout<<ve[i]<<" ";
}
}
return 0;
}