bestcoder#28 1002 dfs
Fibonacci
Accepts: 40
Submissions: 996
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
Problem Description
Following is the recursive definition of 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
Output
For each case output "Yes" or "No".
Sample Input
3 4 17 233
Sample Output
Yes No Yes
题意:判断n是否为一个或多个fib数的乘积
思路:dfs,从大数往小数遍历更省时
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn=1000100; const int INF=1000000000; int T; int n; vector<int> fib; inline int read() { char c=getchar(); while(c!='-'&&!isdigit(c)) c=getchar(); int f=0,tag=1; if(c=='-'){ tag=-1; f=getchar()-'0'; } else f=c-'0'; while(isdigit(c=getchar())) f=f*10+c-'0'; return f*tag; } void creat_fib() { fib.clear(); fib.push_back(0); fib.push_back(1); int x=fib[0]+fib[1]; while(x<=INF&&x>=0){ fib.push_back(x); x=fib[fib.size()-1]+fib[fib.size()-2]; } } bool dfs(int n,int t) { if(t==2) return false; while(true){ if(dfs(n,t-1)) return true; if(n%fib[t]) break; n/=fib[t]; } if(n==1) return true; return false; } int main() { cin>>T; creat_fib(); while(T--){ n=read(); if(n==0||n==1||dfs(n,fib.size()-1)) printf("Yes "); else printf("No "); } return 0; }