[luogu 1306] 斐波那契公约数{欧几里得+矩阵乘法(快速幂加速递推)}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82049046

题目

https://www.luogu.org/problemnew/show/P1306


解题思路

似乎很显然,只需要在矩阵乘法的模板上改一下即可。

g c d ( f ( n ) , f ( m ) ) = f ( g c d ( f ( n ) , f ( m ) ) )


代码

#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]); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/82049046
今日推荐