描述 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,… 你的任务是判断给定的数字能否被表示成两个斐波那契数的乘积。
输入格式 InputFormat
第一行包含一个整数 t(1<=t<=10),表示询问数量。接下来 t 行,每行一个整数 n_i(0<=n_i<=10^9)。
输出格式 OutputFormat
输出共 t 行,第 i 行为 TAK(是)或 NIE(否),表示 n_i 能否被表示成两个斐波那契数的乘积。
样例输入 SampleInput
5
5
4
12
11
10
样例输出 SampleOutput
TAK
TAK
NIE
NIE
TAK
代码 Code
可知 109 以内的斐波那契数列不超过五十个,于是枚举就行了。
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int i,j,t,n,m,l,r,k,z,y,x;
long long f[55];
long long N;
bool ok;
int main()
{
f[1]=0;f[2]=1;
for (i=3;f[i-1]+f[i-2]<=(int)1e9;i++) f[i]=f[i-1]+f[i-2];
n=i-1;
scanf("%d",&t);
while (t--)
{
scanf("%lld",&N);
ok=false;
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++) if (f[i]*f[j]==N)
{
ok=true;
break;
}
if (ok) break;
}
if (ok) printf("TAK\n");
else printf("NIE\n");
}
return 0;
}