题目大意:
给出一个数n,判断这个数n可否表示成斐波那契数相乘的形式。
思路分析:
n的范围是0~1000,000,000,这个范围内有44个斐波那契数 ,直接搜索就好。
代码实现:
#include<stdio.h>
#include<string.h>
int fb[47],fac[10],flag,cnt;
void f(){
fb[0]=0;
fb[1]=1;
for(int i=2;i<47;i++){
fb[i]=fb[i-1]+fb[i-2];
}
}
void dfs(int n,int a){
if(n==1){
flag=1;
return;
}
if(flag==1) return;
for(int i=a;i<cnt;i++)
if(n%fac[i]==0) dfs(n/fac[i],i);
}
int main(){
f();
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
if(n==0){
printf("Yes\n");
continue;
}
cnt=0;
for(int i=3;i<47;i++){
if(n%fb[i]==0)
fac[cnt++]=fb[i];
}
flag=0;
dfs(n,0);
if(flag==0) printf("No\n");
else printf("Yes\n");
}
}
#include<stdio.h>
#include<string.h>
int fb[47];
void f(){
fb[0]=0;
fb[1]=1;
for(int i=2;i<47;i++){
fb[i]=fb[i-1]+fb[i-2];
}
}
int main(){
f();
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
if(n==0){
printf("Yes\n");
continue;
}
for(int i=3;n>=fb[i];i++){
while(n%fb[i]==0) n/=fb[i];
if(n==1) break;
}
if(n>1) printf("No\n");
else printf("Yes\n");
}
}