F(n)表示第n项的斐波那契数。问F(n)和F(m)的最大公约数
暴力做法是直接求出F(n)和F(m)然后用gcd或者__gcd求,但这种做法显然是要费时间的。结论:gcd(F(n),F(m))= F(gcd(n,m))
直接使用矩阵快速幂可快速求得F(n)和F(m)的最大公约数
struct mat{ll a[3][3],r,c;};
mat mul(mat x,mat y)
{
mat p;
mem(p);
for(int i=0;i<x.r;i++)
for(int j=0;j<y.c;j++)
for(int k=0;k<x.c;k++)
p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
p.r=x.r,p.c=y.c;
return p;
}
void fast(ll k)
{
mat p,ans;
mem(p),mem(ans);
p.r=p.c=2;
p.a[0][0]=p.a[0][1]=p.a[1][0]=1;
ans.r=1,ans.c=2;
ans.a[0][0]=ans.a[0][1]=1;
while(k)
{
if(k&1)ans=mul(ans,p);
p=mul(p,p);
k>>=1;
}
cout<<ans.a[0][0];
}