题意:
判断给定的数字能否被表示成两个斐波那契数的乘积。n≤10^9
题解:
开始在想有没有什么根号级算法,后来想知道斐波那契数列10000位有多大,结果爆long long了……实际上斐波那契数列到45位就大于10^9了。所以直接枚举即可。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define maxn 45 6 using namespace std; 7 8 int a[maxn+5]; int t; 9 int main(){ 10 a[1]=1; a[2]=1; inc(i,3,maxn)a[i]=a[i-1]+a[i-2]; scanf("%d",&t); 11 while(t--){ 12 int b; scanf("%d",&b); if(b==0){puts("TAK"); continue;} bool f=0; 13 inc(i,1,maxn){ 14 inc(j,1,maxn)if((long long)a[i]*a[j]==b){puts("TAK"); f=1; break;} 15 if(f)break; 16 } 17 if(!f)puts("NIE"); 18 } 19 return 0; 20 }
20160813
原文:http://www.cnblogs.com/YuanZiming/p/5777970.html