题目描述
对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很“简单”问题:第n项和第m项的最大公约数是多少?
Update:加入了一组数据。
输入输出格式
输入格式:
两个正整数n和m。(n,m<=10^9)
注意:数据很大
输出格式:
Fn和Fm的最大公约数。
由于看了大数字就头晕,所以只要输出最后的8位数字就可以了。
输入输出样例
说明
用递归&递推会超时
用通项公式也会超时
注意公式推导,然后练练矩阵快速幂,ahh。
AC代码如下:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int MOD=1e8; long long b,n,d; struct p { int a[2][2]; }res,c; p mul(p x,p y) { p ret; memset(ret.a,0,sizeof(ret.a)); for(int i=0;i<=1;i++) for(int j=0;j<=1;j++) for(int k=0;k<=1;k++) ret.a[i][j]=1ll*(ret.a[i][j]+1ll*x.a[i][k]*y.a[k][j]%MOD)%MOD; return ret; } void solve(long long n) { c.a[0][0]=c.a[0][1]=c.a[1][0]=1; for(int i=0;i<2;i++) res.a[i][i]=1; while(n) { if(n&1) res=mul(res,c); c=mul(c,c); n>>=1; } printf("%d",res.a[0][1]); } long long gcd(long long a,long long b) { long long t; while(1) { if(!b) break; t=a;a=b;b=t%a; } return a; } int main() { scanf("%lld%lld",&b,&d); n=gcd(b,d); solve(n); return 0; }