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
题解
前几天考过一次式好像$Fibonacci$的第九十几项就爆$long long$了...
这次是$10^9$,所以大概第四五十就爆了。显然就是暴力枚举了...
老是把$f_0$记成$1$,$WA$声一片...
1 //It is made by Awson on 2017.10.14 2 #include <set> 3 #include <map> 4 #include <cmath> 5 #include <ctime> 6 #include <cmath> 7 #include <stack> 8 #include <queue> 9 #include <vector> 10 #include <string> 11 #include <cstdio> 12 #include <cstdlib> 13 #include <cstring> 14 #include <iostream> 15 #include <algorithm> 16 #define LL long long 17 #define Min(a, b) ((a) < (b) ? (a) : (b)) 18 #define Max(a, b) ((a) > (b) ? (a) : (b)) 19 #define sqr(x) ((x)*(x)) 20 using namespace std; 21 const int N = 100; 22 const int LIM = 1e9; 23 24 int n, f[N+5], lim; 25 26 void pre() { 27 f[0] = 0; f[1] = 1; 28 for (int i = 2; i <= N; i++) { 29 f[i] = f[i-1]+f[i-2]; 30 if (f[i] >= LIM) { 31 lim = i; 32 break; 33 } 34 } 35 } 36 void work() { 37 scanf("%d", &n); 38 for (int i = 0; i <= lim; i++) 39 for (int j = i; j <= lim; j++) 40 if ((LL)n == (LL)f[i]*f[j]) { 41 printf("TAK "); 42 return; 43 } 44 printf("NIE "); 45 } 46 int main() { 47 pre(); 48 int t; scanf("%d", &t); 49 while (t--) work(); 50 return 0; 51 }