https://codeforces.com/contest/1453/problem/D
研究了一年 1 0为啥期望是6。。。
然后猜出了相邻两个1之间相差长度是m,期望是2^(m+1)-2,虽然不是很明白
接下来贪心就可以了,m从大到小枚举,<=k的时候,就选尽量多的,因为都是2次幂加起来,只要k是偶数一定可以凑出来
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxl=3e5+10;
int n,m,cnt,tot,cas,ans;ll k;
ll a[maxl],c[maxl];
ll b[maxl];
bool vis[maxl];
char s[maxl];
inline void prework()
{
scanf("%lld",&k);
m=1;b[1]=2;ll t=2;
while(b[m]<k)
{
++m;t*=2;
b[m]=b[m-1]+t;
}
}
inline void mainwork()
{
ans=0;cnt=0;ll d,len=1;
if(k&1)
return;
for(int i=m;i>=1;i--)
if(k>=b[i])
{
d=k/b[i];
k-=d*b[i];
for(int j=1;j<=d;j++)
c[++cnt]=i;
len+=d*i;
if(len>2000)
return;
}
if(k==0)
ans=1;
else
return;
n=0;
for(int i=cnt;i>=1;i--)
{
a[++n]=1;
for(int j=1;j<c[i];j++)
a[++n]=0;
}
if(n>2000)
ans=0;
}
inline void print()
{
if(!ans)
puts("-1");
else
{
printf("%d\n",n);
for(int i=1;i<=n;i++)
printf("%lld%c",a[i]," \n"[i==n]);
}
}
int main()
{
int t=1;
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}