构造一个这样的游戏关卡使得玩家通过全部关卡的期望步数等于k。
首先肯定是分块的,每个1以及后面的连续0是同一块。先计算一下每一种块的的期望:
1 : E =
1
2
\frac{1}{2}
21 * 1 +
1
2
\frac{1}{2}
21 * (1+E) (没通过返回1之后又是独立重复实验期望不变)
解得
E
1
E_1
E1 = 2 ;
10 : E =
1
4
\frac{1}{4}
41 * 2 +
1
2
\frac{1}{2}
21 * (1+E) +
1
4
\frac{1}{4}
41 * (2+E)
解得
E
2
E_2
E2 = 6;
100 : E =
1
8
\frac{1}{8}
81 * 3 +
1
2
\frac{1}{2}
21 * (1+E) +
1
4
\frac{1}{4}
41 * (2+E) +
1
8
\frac{1}{8}
81 * (3+E)
解得
E
3
E_3
E3 = 14 ;
…
E
i
E_i
Ei =
E
i
−
1
E_{i-1}
Ei−1 * 2 + 2;
所以期望只能是偶数不可能是奇数,然后二分就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=63;
int t,n,m;
ll k,f[N];
int main()
{
for(int i=1;i<N;++i) f[i]=f[i-1]*2+2;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&k);
vector<int> ve;
if(k&1) puts("-1");
else
{
while(k)
{
int pos=upper_bound(f+1,f+N,k)-f;
pos--;
k-=f[pos];
ve.push_back(1);
for(int i=1;i<pos;++i) ve.push_back(0);
}
cout<<ve.size()<<endl;
for(int i=0;i<ve.size();++i)
cout<<ve[i]<<' ';
puts("");
}
}
return 0;
}