【问题描述】
豆豆最近迷上了Fibonacci数,然后他开始研究Fibonacci数的乘积。现在他想问你某个数能不能分解成两个Fibonacci数的乘积?
Fibonacci数的定义:F0=0,F1=1,Fk=Fk-1+Fk-2。
【输入格式】
第一行一个整数T代表提问次数。
接下来T行,每行一个数字A表示豆豆询问你的数。
【输出格式】
对于每次提问,如果这个数可以被分解成两个Fibonacci数的成绩输出“Yes”,否则输出“No”。
【输入样例】
5
5
4
12
11
10
【输出样例】
Yes
Yes
No
No
Yes
【数据范围】
对于50%的数据:A≤50;
对于100%的数据:T≤100,0≤A≤109 。
思路
由于fib数列增长很快,所以109以内的fib数只有不足50个。
所以预处理满足要求的数就好了。
注意0。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=57;
ll a[N],x;int n;
int main()
{
a[0]=0;a[1]=1;
for(int i=2; i<=50; i++) a[i]=a[i-1]+a[i-2];
scanf("%d",&n);
while (n--)
{
scanf("%lld",&x);int b=0;
for(int i=0;i<=50;i++)
for(int j=0;j<=50;j++)
if(a[i]*a[j]==x)
{
b=1; break;
}
if(!b) printf("No\n"); else printf("Yes\n");
}
}