tyvj 1532 斐波那契的纠结 求gcd(f[i],f[j])

  
  
  背景 Background 
 继上次Z成功地把Andy给的小数化成分数之后,Z收到了各路神犇Orz性质的语言(会掉RP的)。不过一天Z看见了这样一句话:“思念就像斐波那契数列般绵延。”看着这一句,Z灵感一现,一道新题就出来了!
   
   
  描述 Description 
 一天,Z懂得了Fibonacci数列,发现数列有以下规律:
F[1]=F[2]=1; F[N]=F[N-1]+F[N-2];
于是Z觉得很神奇,想知道任意两个Fibonacci数有没有大于1的公约数。但是光在有限的范围内手算还不行,于是Z找到了你,希望你能帮忙编个程序算算。
任务:指定两个Fibonacci数的项数(也就是这两个数各是第几项),求出这两个数的最大公约数。
例如输入3 6,输出2(因为GCD(F[3],F[6])=2)。
   
   
 输入格式 Input Format 
 每个输入文件都有10组数据,每组数据格式如下:
只有一行:两个整数A和B(数据规模见【注释HINT】),表示要求公约数的两个数是F[A],F
   
   
  输出格式 Output Format 
 对于每组数据,输出相应的GCD(F[A],F)即可。(也就是说有10行输出。)
   
   
  样例输入 Sample Input [复制数据] 
 
   
   
  样例输出 Sample Output [复制数据] 
 
   
   
  时间限制 Time Limitation 
 普通数据1s,极限数据1s(没有打错-_-)。
   
   
  注释 Hint 
 50%的数据:0<A,B<32
100%的数据:0<A,B<100002
保证最后输出的数字不超过2^64-1(所以请用64位无符号整数)
可能会有数据重复出现,因为这是随机数,且Z不想写判重,太麻烦-_-",照常做即可。

 //

 

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
unsigned long long f[200];

//gcd(f[i],f[j])=f[gcd(i,j)]
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    f[0]=0,f[1]=1;
    for(int i=2;i<200;i++) f[i]=f[i-1]+f[i-2];
    int a,b;
    while(scanf("%d%d",&a,&b)==2)
    {
        int g=gcd(a,b);
        cout<<f[g]<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值