写出前几个pinary数,会发现有1个一位数,1个两位数,2个三位数,3个四位数,5个五位数。。。。 没错就是斐波那契数列。
找到这个规律后接下来的问题就迎刃而解了。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int maxn = 100;
LL a[maxn] , sum[maxn];
int ans[maxn];
int main()
{
//freopen("output.txt" , "w" ,stdout);
a[1] = a[2] = 1;
for(int i=3;i<100;i++) a[i] = a[i-1] + a[i-2] ;
//sum[0] = 1;
for(int i=1;i<100;i++) sum[i] = sum[i-1] + a[i];
//for(int i=0;i<100;i++) cout<<sum[i]<<endl;
int T ;
LL K;
scanf("%d" , &T);
while(T--){
scanf("%lld" , &K);
int len = lower_bound(sum , sum+50 , K) - sum;
int p=len;
ans[p] = 1 , ans[p-1] = 0 , p-=2 , K-=sum[len-1];
while(p > 0){
if(K>sum[p-1]+1){
ans[p] = 1 , ans[p-1] = 0 , K -= sum[p-1]+1 , p-=2; //注意这里是sum[]+1 , 因为可存在前导零。
}
else {
ans[p] = 0 , p--;
}
}
for(int i=len;i>0 ;i--) printf("%d" , ans[i]);
printf("\n");
}
return 0;
}