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
 
正解:数学+暴力。

因为$f[45]$就炸了,所以$f$算到第$44$个就行了。

然后每组询问暴力枚举两个数判断。

 

 1 #include <bits/stdc++.h>
 2 #define il inline
 3 #define RG register
 4 #define ll long long
 5 
 6 using namespace std;
 7 
 8 int f[50],n;
 9 
10 il int gi(){
11   RG int x=0,q=1; RG char ch=getchar();
12   while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
13   if (ch=='-') q=-1,ch=getchar();
14   while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar();
15   return q*x;
16 }
17 
18 il void work(){
19   n=gi();
20   for (RG int i=0;i<=44;++i)
21     for (RG int j=0;j<=44;++j)
22       if (1LL*f[i]*f[j]==n){ puts("TAK"); return; }
23   puts("NIE"); return;
24 }
25 
26 int main(){
27 #ifndef ONLINE_JUDGE
28   freopen("Iloczyn.in","r",stdin);
29   freopen("Iloczyn.out","w",stdout);
30 #endif
31   f[1]=1; for (RG int i=2;i<=44;++i) f[i]=f[i-1]+f[i-2];
32   RG int T=gi(); while (T--) work(); return 0;
33 }

 

posted @ 2017-10-14 18:20  wfj_2048  阅读(153)  评论(0编辑  收藏  举报