• 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 }
  • 相关阅读:
    Asp.net调用百度搜索引擎
    iOS 之 alcatraz (插件管理器)
    @dynamic、@synthesize
    iOS 准备
    iOS 沙盒
    iOS 引导页
    iOS 开发之登陆
    iOS 程序开发
    Java 验证用户名、密码
    数据库操作
  • 原文地址:https://www.cnblogs.com/wfj2048/p/7655412.html
Copyright © 2020-2023  润新知