【题解】AGC012C Tautonym Puzzle(人类智慧)
一个naive的想法是,先放len个(a),此时有(2^{len}-1)的贡献,然后递归到子问题,这个很遗憾是过不了的(I开头的神仙:但是我可以过)
但是这个启示我们一件事情,我们想办法利用二进制倍增来弄。
考虑增量构造,我们把这个序列分为前后两半部分,每次我可以选择插入两个相同的之前没有的数一个在最后面一个在:
- 在中间,答案乘2
- 在两边,答案减一
然后直接快速幂搞搞
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<deque>
using namespace std; typedef long long ll;
int main(){
ll n;
deque<int> ans;
cin>>n; ++n;
while(n)
if(n&1) n>>=1,ans.push_back(ans.size()+1);
else --n,ans.push_front(ans.size()+1);
cout<<(ans.size()<<1)<<endl;
for(auto t:ans) cout<<t<<' ';
for(int t=1;t<=(int)ans.size();++t) cout<<t<<' ';
cout<<endl;
return 0;
}