装饰
链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4096
题解
用
f
i
f_i
fi表示
i
i
i位数满足要求的有多少种
从高位到低位依次贪心,每次看一下这一位如果填
1
1
1会不会超出范围,如果没超出就填上
1
1
1,否则填
0
0
0
代码
//递推、贪心
#include <bits/stdc++.h>
#define maxn 50
#define ll long long
using namespace std;
ll f[maxn];
void preprocess()
{
ll i, j;
f[0]=f[1]=1;
for(i=2;i<maxn;i++)
{
for(j=0;j<i-1;j++)f[i]+=f[j];
f[i]++;
}
}
void work(ll k)
{
ll i, flag=0;
for(i=maxn-1;i;i--)
{
if(f[i]<=k)k-=f[i], putchar(49), flag=1;
else if(flag)putchar(48);
}
putchar(10);
}
int main()
{
ll T, K;
preprocess();
scanf("%lld",&T);
while(T--)scanf("%lld",&K), work(K);
return 0;
}