21 ICPC 昆明 D
Divisions
题链
构造 重点是以最少的变量最简单的方式
第一下就想到了二进制平凑
我们发现我们只需要让S先是一个单调不减的序列
要是有相等的 我们就可以拿去B 并且拿去B的满足每个数字不相干
但是我们仔细发现每个块只有2^n-1种(因为大家公用了空这种) 那没关系
我们除了最后加1就可以了 加的1的个数就是二进制种1的个数
最后记得特判我们空的那一种就可以了
当然我们也可以直接用2^n-1进制平凑也可以
void solve(){
int n;cin>>n;
if(n==1){
cout<<6<<endl;
cout<<"1 1 4 5 1 4"<<endl;
return;
}
if(n==0){
cout << "9\n";
cout << "7 8 9 4 5 6 1 2 3\n";
return;
}
vector<int>ans;
n--;
int cnt=0;
for(int i=0;i<30;i++){
if(n>>i&1){
for(int j=1;j<=i;j++){
ans.push_back(i+1);
}
cnt++;
}
}
for(int i=1;i<=cnt;i++){
ans.push_back(i+100);
}
cout<<ans.size()<<endl;
for(auto i:ans)cout<<i<<' ';
}