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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章