Description
斐波那契数列的定义为:k=0或1时,F[k]=k;k>1时,F[k]=F[k-1]+F[k-2]。数列的开头几项为0,1,1,2,3,5,8,13,21,34,55,…你的任务是判断给定的数字能否被表示成两个斐波那契数的乘积。
Input
第一行包含一个整数t(1<=t<=10),表示询问数量。接下来t行,每行一个整数n_i(0<=n_i<=10^9)。
Output
输出共t行,第i行为TAK(是)或NIE(否),表示n_i能否被表示成两个斐波那契数的乘积。
Sample Input
5
5
4
12
11
10
5
4
12
11
10
Sample Output
TAK
TAK
NIE
NIE
TAK
TAK
NIE
NIE
TAK
正解:数学+暴力。
因为$f[45]$就炸了,所以$f$算到第$44$个就行了。
然后每组询问暴力枚举两个数判断。
1 #include <bits/stdc++.h> 2 #define il inline 3 #define RG register 4 #define ll long long 5 6 using namespace std; 7 8 int f[50],n; 9 10 il int gi(){ 11 RG int x=0,q=1; RG char ch=getchar(); 12 while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); 13 if (ch=='-') q=-1,ch=getchar(); 14 while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); 15 return q*x; 16 } 17 18 il void work(){ 19 n=gi(); 20 for (RG int i=0;i<=44;++i) 21 for (RG int j=0;j<=44;++j) 22 if (1LL*f[i]*f[j]==n){ puts("TAK"); return; } 23 puts("NIE"); return; 24 } 25 26 int main(){ 27 #ifndef ONLINE_JUDGE 28 freopen("Iloczyn.in","r",stdin); 29 freopen("Iloczyn.out","w",stdout); 30 #endif 31 f[1]=1; for (RG int i=2;i<=44;++i) f[i]=f[i-1]+f[i-2]; 32 RG int T=gi(); while (T--) work(); return 0; 33 }