版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82049046
题目
https://www.luogu.org/problemnew/show/P1306
解题思路
似乎很显然,只需要在矩阵乘法的模板上改一下即可。
代码
#include<cstdio>
#include<cstring>
#define w 2
#define LL long long
#define rep(i,x,y) for(register int i=x;i<y;i++)
using namespace std;
const LL WYC=100000000;
LL n,m,f[w],a[w][w],g[w];
LL gcd(LL x,LL y) {return y?gcd(y,x%y):x;}
void mull()
{
LL c[w][w]={{0,0},{0,0}};
rep(i,0,w) rep(j,0,w) rep(k,0,w)
c[i][j]=(c[i][j]+a[i][k]*a[k][j])%WYC;
memcpy(a,c,sizeof(c));
}
void mul()
{
LL c[w]={0,0};
rep(j,0,w) rep(k,0,w)
c[j]=(c[j]+f[k]*a[k][j])%WYC;
memcpy(f,c,sizeof(c));
}
int main()
{
scanf("%lld%lld",&n,&m);
n=gcd(n,m);
f[0]=0; f[1]=1;
a[0][0]=0; a[0][1]=1; a[1][0]=1; a[1][1]=1;
for(;n;mull(),n>>=1) if (n&1) mul();
printf("%lld",f[0]);
}