BZOJ-3713[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
5
4
12
11
10
Sample Output
TAK
TAK
NIE
NIE
TAK
TAK
NIE
NIE
TAK
HINT
Source
题解
这道题直接把1e9内的所有斐波那契数都推出来
每次读入的时候枚举斐波那契数,判断一下这个数是否能被整除,并且整除后的数是否在斐波那契数列中
1 #include<bits/stdc++.h> 2 using namespace std; 3 int T,n,num; 4 int fib[50]; 5 map<int,bool> flag; 6 int main(){ 7 scanf("%d",&T); 8 fib[1]=1; fib[2]=1; flag[1]=true; 9 for (int i=3;i<=45;i++) fib[i]=fib[i-1]+fib[i-2],flag[fib[i]]=true; 10 while (T--){ 11 scanf("%d",&n); 12 if (!n){ 13 puts("TAK"); 14 continue; 15 } 16 int t=1,d=sqrt(n); 17 bool Flag=false; 18 while (fib[t]<=d){ 19 if (!(n%fib[t])&&flag[n/fib[t]]){ 20 Flag=true; 21 puts("TAK"); 22 break; 23 } 24 t++; 25 } 26 if (!Flag) puts("NIE"); 27 } 28 return 0; 29 }