【Checkpoints】
定义E(i)为从第i关开始到通关,所需要通过的关卡的期望。
假设从第 l 关开始到第 r 关只有第 l 关有存档点,那么:
E(l)E(l+1)E(r−1)==⋯=21(E(l)+E(l+1))+121(E(l)+E(l+2))+121(E(l)+E(r))+1
E(l)E(l+1)E(l+2)===⋯21E(l)+21[43E(l)+41E(l+3)+23]+121E(l)+21[21(E(l)+E(l+3))+1]+121(E(l)+E(l+3))+1==87E(l)+81E(l+3)+4743E(l)+41E(l+3)+23
由数学归纳法可得(令L=r−l≥1):
E(l)==2L2L−1E(l)+2L1E(r)+2L−12L−1E(r)+2L+1−2
因为E(n+1)=0(通关),且任意项的2L+1−2(L≥1)相加均为偶数,所以E(1)为偶数,即当k为奇数时,一定构造不出来。
又因(2L+1−2)+(21+1−2)=2L+1(L≥1),多个2L+1(L≥1)的累加可以表示任意偶数,故偶数一定可以构造出来。(L=1, 21+1−2=2)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll k, T;
vector<int> res;
void solve() {
res.push_back(1);
if((1LL << 1) & k) res.push_back(1);
for(int i = 2; i <= 60; i++) {
if((1LL << i) & k) {
for(int j = 1; j <= i - 2; j++)
res.push_back(0);
res.push_back(1);
res.push_back(1);
}
}
}
int main() {
cin >> T;
while(T--) {
cin >> k;
if(k & 1) {
cout << -1 << "\n";
continue;
}
res.clear();
solve();
cout << res.size() - 1 << "\n";
for(int i = 0; i < res.size() - 1; i++)
cout << res[i] << " \n"[i == res.size() - 2];
}
return 0;
}