因为斐波那契数列增长很快(指数级),所以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 }