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

Sample Output

TAK
TAK
NIE
NIE
TAK

HINT





做做水题有益身心健康……
fib只要40+项,值就接近10^9次了
所以每次可以直接根号n枚举n的所有约数,然后判断两个约数是不是都出现过。
很蠢用了map去判断有没有出现。
其实直接暴力枚举啊= =


#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,tmp,fib[50];
bool f;
map<ll,bool> M;
void solve(){
	scanf("%lld",&n);
	if (!n){puts("TAK");return;}
	tmp=sqrt(n);
	f=0;
	for (int i=1;i<=tmp;i++)
		if (!(n%i))
			if (((i!=1 && M[i]) || i==1) &&
				((n/i!=1 && M[n/i]) || n==i)){f=1;break;}
	if (f) puts("TAK"); else puts("NIE");
}
int main(){
	int cas;cin>>cas;
	fib[1]=fib[2]=1LL;
	for (int i=3;i<=46;i++)
		fib[i]=fib[i-1]+fib[i-2],
		M[fib[i]]=1;
	while (cas--) solve();
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值