分析:
结论
:
g
c
d
(
f
i
b
n
,
f
i
b
m
)
=
f
i
b
g
c
d
(
n
,
m
)
:gcd(fib_n,fib_m)=fib_{gcd(n,m)}
:gcd(fibn,fibm)=fibgcd(n,m)
然后先求出
g
c
d
(
n
,
m
)
gcd(n,m)
gcd(n,m) 再矩阵乘法 求斐波那契数列即可
具体矩阵乘法
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=1e8;
long long n,m;
struct matrix{
long long n,m;
long long G[3][3];
}base,A,B;
matrix operator *(matrix a,matrix b)
{
matrix C;
C.n=a.n;C.m=b.m;
for(int i=1;i<=C.n;i++)
for(int j=1;j<=C.m;j++)
C.G[i][j]=0;
for(int k=1;k<=a.m;k++)
for(int i=1;i<=a.n;i++)
for(int j=1;j<=b.m;j++)
C.G[i][j]=(C.G[i][j]+a.G[i][k]*b.G[k][j]%mod)%mod;
return C;
}
void ksm(long long x){
if(x==1){
A=base;
return;
}
ksm(x/2);
A=A*A;
if(x&1) A=A*base;
}
int main(){
scanf("%lld%lld",&n,&m);
n=__gcd(n,m);
base.n=2;base.m=2;
base.G[1][1]=0;base.G[1][2]=1;
base.G[2][1]=1;base.G[2][2]=1;
if(n<=2){
printf("1");
return 0;
}
else{
B.m=2;B.n=1;
B.G[1][1]=1;B.G[1][2]=1;
ksm(n-1);
B=B*A;
printf("%lld",B.G[1][1]);
}
return 0;
}