【題解】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;
}