Fibonacci
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3215 Accepted Submission(s): 846
Problem Description
Following is the recursive definition of Fibonacci sequence:
Now we need to check whether a number can be expressed as the product of numbers in the Fibonacci sequence.
Fi=⎧⎩⎨01Fi−1+Fi−2i = 0i = 1i > 1
Now we need to check whether a number can be expressed as the product of numbers in the Fibonacci sequence.
Input
There is a number
T
shows there are
T
test cases below. (
T≤100,000
)
For each test case , the first line contains a integers n , which means the number need to be checked.
0≤n≤1,000,000,000
For each test case , the first line contains a integers n , which means the number need to be checked.
0≤n≤1,000,000,000
Output
For each case output "Yes" or "No".
Sample Input
3 4 17 233
Sample Output
Yes No Yes
Source
思路:从大到小dfs斐波拉契数。
# include <iostream>
# include <cstdio>
using namespace std;
int fi[46]={0,1,1};
void init()
{
for(int i=3; i<45; ++i)
fi[i] = fi[i-1]+fi[i-2];
}
int dfs(int n, int x)
{
if(n <= 2) return 1;
for(int i=x; i>=3; --i)
if(n%fi[i]==0)
if(dfs(n/fi[i],i)) return 1;
return 0;
}
int main()
{
init();
int t, n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
if(dfs(n, 44)) puts("Yes");
else puts("No");
}
return 0;
}