对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少?
输入格式:
两个正整数n和m。(n,m<=10^9)
注意:数据很大
输出格式:
Fn和Fm的最大公约数。
由于看了大数字就头晕,所以只要输出最后的8位数字就可以了。
输入样例#1:
4 7
输出样例#1:
1
用递归&递推会超时
用通项公式也会超时
扩展欧几里得有一个非常重要的性质
gcd(F[i],F[j])=F[gcd(i,j)]
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #define LL long long
5 using namespace std;
6 const LL mod=100000000;
7 const LL MAXN=5000001;
8 inline LL read()
9 {
10 char c=getchar();LL x=0,flag=1;
11 while(c<'0'||c>'9') {if(c=='-') flag=-1;c=getchar();}
12 while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();return x*flag;
13 }
14 LL dp[MAXN];
15 LL gcd(LL a,LL b)
16 {
17 return b==0?a:gcd(b,a%b);
18 }
19 int main()
20 {
21 LL n=read(),m=read();
22 dp[1]=1;dp[2]=1;
23 for(LL i=3;i<=5000000;i++)
24 dp[i]=(dp[i-1]+dp[i-2])%100000000;
25
26 LL p=gcd(n,m);
27 printf("%lld",dp[p]%100000000);
28 return 0;
29 }