【题解】AGC012C Tautonym Puzzle(人类智慧)
【题解】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;
}
博客保留所有权利,谢绝学步园、码迷等不在文首明显处显著标明转载来源的任何个人或组织进行转载!其他文明转载授权且欢迎!