【题目大意】求Gcd(F[a],F[b])
【题解】 靠Gcd(F[a],F[a-1])=1 和 F[a+b]=F[a-1]F[b]+F[a]F[b+1]可推出Gcd(F[a],F[b])=F[Gcd(a,b)]
一开始没多想直接上矩阵快速幂
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct Matrix{
ll m[2][2];
inline Matrix()
{
m[0][0]=m[1][0]=m[0][1]=1;
m[1][1]=0;
}
inline Matrix operator *(const Matrix &b) const
{
Matrix ret;
for (int i=0;i<=1;i++)
for (int j=0;j<=1;j++)
{
ret.m[i][j]=0;
for (int k=0;k<=1;k++)
{
ret.m[i][j]=(ret.m[i][j]+m[i][k]*b.m[k][j]) %100000000;
}
}
return ret;
}
inline Matrix ksm(int n)
{
Matrix ans;
ans.m[1][1]=1;
ans.m[1][0]=ans.m[0][1]=0;
while (n)
{
if (n&1)
{
ans=ans*(*this);
}
*this=*this*(*this);
n=n/2;;
}
return ans;
}
inline void print()
{
cout<<m[0][1]%100000000<<endl;
}
}aa;
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
int main()
{
int a,b,c;
cin>>a>>b;
if(a<b) swap(a,b);
c=gcd(a,b);
// cout<<c<<endl;
aa.ksm(c).print();
return 0;
}
后来发现数据很弱直接递推就行了。。。