AGC012C: Tautonym Puzzle

https://agc012.contest.atcoder.jp/tasks/agc012_c

12345...12345...みたいに並べて2^n関連でやることは見えたけどそこからが思いつかなかった。
要素入れ替えたりを考えたけど、想定解は挿入でした。

やっぱり秩序なくやるよりも、定式化できそうな良い構造に沿ってやるのが良さそうですね。

ll N;

void solve() {
	cin >> N;
	ll a = 0, n = 1;
	while(n * 2 <= N + 1) {
		a++; n *= 2;
	}
	vector<int> ans;
	ll cn = N + 1 - n;
	rep(i, 0, a) {
		if(cn & (1LL << i)) {
			cn -= (1LL << i);
			ans.pb(99 - i);
		}
		ans.pb(i);
	}
	rep(i, 0, 100) ans.pb(i);
	cout << sz(ans) << "\n";
	rep(i, 0, sz(ans)) {
		cout << ans[i] + 1 << " ";
	}
	cout << "\n";
}