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
HINT
做做水题有益身心健康……
fib只要40+项,值就接近10^9次了
所以每次可以直接根号n枚举n的所有约数,然后判断两个约数是不是都出现过。
很蠢用了map去判断有没有出现。
其实直接暴力枚举啊= =
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,tmp,fib[50];
bool f;
map<ll,bool> M;
void solve(){
scanf("%lld",&n);
if (!n){puts("TAK");return;}
tmp=sqrt(n);
f=0;
for (int i=1;i<=tmp;i++)
if (!(n%i))
if (((i!=1 && M[i]) || i==1) &&
((n/i!=1 && M[n/i]) || n==i)){f=1;break;}
if (f) puts("TAK"); else puts("NIE");
}
int main(){
int cas;cin>>cas;
fib[1]=fib[2]=1LL;
for (int i=3;i<=46;i++)
fib[i]=fib[i-1]+fib[i-2],
M[fib[i]]=1;
while (cas--) solve();
return 0;
}