码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj3713 [PA2014]Iloczyn

时间:2017-10-14 19:54:34      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:open   void   work   col   div   inline   a20   --   names   

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 }

 

bzoj3713 [PA2014]Iloczyn

标签:open   void   work   col   div   inline   a20   --   names   

原文地址:http://www.cnblogs.com/wfj2048/p/7655412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!