hdu 5167 bfs

因为斐波那契数列增长很快(指数级),所以10Y以内只有不到50个斐波那契数,将这些数字所有可能的乘积存起来查询即可,这里采用bfs+set的方式。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 #include <set>
 6 using namespace std;
 7 
 8 typedef long long ll;
 9 const int INF = 1000000000;
10 const int N = 44;
11 int f[N];
12 set<int> s;
13 
14 void init()
15 {
16     f[0] = 2;
17     f[1] = 3;
18     for ( int i = 2; i < N; i++ )
19     {
20         f[i] = f[i - 1] + f[i - 2];
21     }
22 }
23 
24 void get()
25 {
26     init();
27     queue<int> q;
28     q.push(1);
29     s.insert(1);
30     while ( !q.empty() )
31     {
32         int cur = q.front();
33         q.pop();
34         for ( int i = 0; i < N; i++ )
35         {
36             if ( ( ll ) cur * f[i] > INF ) break;
37             if ( s.find( cur * f[i] ) == s.end() )
38             {
39                 q.push( cur * f[i] );
40                 s.insert( cur * f[i] );
41             }
42         }
43     }
44     s.insert(0);
45 }
46 
47 bool ok( int n )
48 {
49     if ( s.find(n) != s.end() ) return true;
50     return false;
51 }
52 
53 int main ()
54 {
55     get();
56     int t;
57     scanf("%d", &t);
58     while ( t-- )
59     {
60         int n;
61         scanf("%d", &n);
62         if ( ok(n) ) puts("Yes");
63         else puts("No");
64     }
65     return 0;
66 }

 

posted @ 2015-08-15 09:02  hxy_has_been_used  阅读(123)  评论(0编辑  收藏  举报