bzoj3713: [PA2014]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
菲波那切数列增长很快,到了第45个就是10^10了,所以直接搜索即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio> 
#include<queue>
#include<math.h>
using namespace std;
int  f[100];
int   n,t;
bool check()
{
    for(int i=0;i<=44;i++)
    for(int j=0;j<=44;j++)
        if(n==(f[i]*f[j]))
        return 1;
    return 0;
}
int main()
{
    f[0]=0,f[1]=1;
    for(int i=2;i<=44;i++)
        f[i]=f[i-1]+f[i-2];
    scanf("%d",&t);
    for(int i=1;i<=t;i++)
    {
        scanf("%d",&n);
        if(check())
            printf("TAK
");
        else printf("NIE
");
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/CLGYPYJ/p/7043530.html