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能否被表示成两个斐波那契数的乘积。

题解:

鉴于F[44]> 1e9。于是可以把两两乘积算出来,枚举即可。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
//by zrt
//problem:
using namespace std;
int f[46];
set<int> s;
int main(){
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    f[0]=0;f[1]=1;
    for(int i=2;i<=45;i++){
        f[i]=f[i-1]+f[i-2];
    }
    int MAX=1e9;
    for(int i=0;i<=45;i++) s.insert(f[i]);
    for(int i=3;i<=45;i++){
        for(int j=i;j<=45;j++){
            if(f[i]*1LL*f[j]<=MAX){
                s.insert(f[i]*f[j]);
            }
        }
    }
    int t,x;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&x);
        if(s.count(x)){
            puts("TAK");
        }else{
            puts("NIE");
        }
    }
    return 0;
}
时间: 2024-11-09 10:11:23

BZOJ 3713: [PA2014]Iloczyn的相关文章

BZOJ 3713: [PA2014]Iloczyn( 枚举 )

斐波那契数列<10^9的数很少很少...所以直接暴力枚举就行了... ------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; ++i ) #d

3713: [PA2014]Iloczyn

3713: [PA2014]Iloczyn Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 327  Solved: 181[Submit][Status][Discuss] 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 第一行包含一个

bzoj3713[PA2014]Iloczyn*

bzoj3713[PA2014]Iloczyn 题意: 判断给定的数字能否被表示成两个斐波那契数的乘积.n≤10^9 题解: 开始在想有没有什么根号级算法,后来想知道斐波那契数列10000位有多大,结果爆long long了……实际上斐波那契数列到45位就大于10^9了.所以直接枚举即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) fo

BZOJ 3709: [PA2014]Bohater

题目 3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 507  Solved: 163[Submit][Status] Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降到0(或0以下).请问是否存在一种打怪顺序,使得你可以

BZOJ 3714: [PA2014]Kuglarz

呃..好像弃坑了好久=v=..本来打算在bzoj每刷10题合起来写一份题解..但是1个月好像还刷不到10题的样子(水题除外),所以还是单独写一下题解.. Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,-,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,-,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证猜出哪些杯子底下藏着球? Input 第一行一个整数n(1<

【贪心】bzoj 3709:[PA2014]Bohater

3709: [PA2014]Bohater Time Limit: 5 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 653  Solved: 220[Submit][Status][Discuss] Description 在一款电脑游戏中,你需要打败n只怪物(从1到n编号).为了打败第i只怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点生命值.任何时候你的生命值都不能降到0(或0以下).请问是否存在一种打怪顺序

bzoj 3714 [PA2014]Kuglarz 最小生成树

[PA2014]Kuglarz Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1335  Solved: 672[Submit][Status][Discuss] Description 魔术师的桌子上有n个杯子排成一行,编号为1,2,…,n,其中某些杯子底下藏有一个小球,如果你准确地猜出是哪些杯子,你就可以获得奖品.花费c_ij元,魔术师就会告诉你杯子i,i+1,…,j底下藏有球的总数的奇偶性.采取最优的询问策略,你至少需要花费多少元,才能保证

BZOJ:3712: [PA2014]Fiolki

Description 化学家吉丽想要配置一种神奇的药水来拯救世界.吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到.瓶子的容量可以视作是无限的.吉丽知道某几对液体物质在一起时会发生反应产生沉淀,具体反应是1克c[i]物质和1克d[i]物质生成2克沉淀,一直进行直到某一反应物耗尽.生成的沉淀不会和任何物质反应.当有

【暴力】bzoj3713 [PA2014]Iloczyn

没什么好说的. 1 #include<cstdio> 2 using namespace std; 3 typedef long long ll; 4 int n,m;ll x,Fib[101]; 5 int main() 6 { 7 scanf("%d",&n); Fib[1]=1; 8 for(int i=2;;i++) 9 { 10 Fib[i]=Fib[i-2]+Fib[i-1]; 11 if(Fib[i]>1000000000) {m=i; brea