[PA 2014]Iloczyn

[PA 2014]Iloczyn

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

Sample Output

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 }