原题链接传送门
题意:给出一个数x,把x分解表示成若干不同的Fibonacci数的和,
Fibonacci:1 2 3 5 8 13 21 34 ......
1 2 3 4 5 6 7 8
14 = 13+1 = 8+5+1 = 8+3+2+1
14分解成的Fibonacci数就代表对应位数的二进制数位上为1
即13+1~~100001
8+5+1~~11001
8+3+2+1~~10111
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long ll;
int main() {
ll f[50],p[50],s[50];
f[0]=1,f[1]=2,s[0]=1;
for(int i=2; i<50; i++) {
f[i] = f[i-1] + f[i-2];
}
for(int i=1;i<50;i++){
s[i] = f[i] + s[i-1];
}
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(p,0,sizeof(p));
for(int i=49;i>0;i--){
if(s[i-1] < n){
p[i] = 1;
n -= f[i];
}
}
if(n == 1)
p[0] = 1;
ll res = 0;
for(int i=0;i<50;i++){
res += (p[i] * pow(2,i));
}
printf("%lld\n",res);
}
return 0;
}