| | | | 背景 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 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;
}