快速幂模板

Posted Go

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂模板相关的知识,希望对你有一定的参考价值。

//快速幂
ll quickMod(ll a,ll b,ll mod){
    ll ans=1;
    while(b){
        if(b&1){
            ans=(ans*a)%mod;
        }
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}

//矩阵快速幂
struct Matrix{
    int matrix[maxn][maxn];
    Matrix(){}
    Matrix(int sign){
        for(int i=1;i<=sign;i++){
            for(int j=1;j<=sign;j++){
                if(i==j) matrix[i][j]=1;
                else matrix[i][j]=0;
            }
        }
    }
};
Matrix add(Matrix* a,Matrix* b){
    Matrix tmp;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            tmp.matrix[i][j]=a->matrix[i][j]+b->matrix[i][j];
        }
    }
    return tmp;
}
Matrix subtract(Matrix* a,Matrix* b){
    Matrix tmp;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            tmp.matrix[i][j]=a->matrix[i][j]-b->matrix[i][j];
        }
    }
    return tmp;
}
Matrix multiply(Matrix* a,Matrix* b){
    Matrix tmp;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            tmp.matrix[i][j]=0;
            for(int k=1;k<=n;k++){
                tmp.matrix[i][j]+=a->matrix[i][k]*b->matrix[k][j];
            }
        }
    }
    return tmp;
}
Matrix quickMod(Matrix base,int b){
    Matrix tmp;
    Matrix ans(n);
    while(b){
        if(b&1){
            tmp=multiply(&ans,&base);
        }
        ans=tmp;
        tmp=multiply(&base,&base);
        base=tmp;
        b>>=1;
    }
    return ans;
}

  

以上是关于快速幂模板的主要内容,如果未能解决你的问题,请参考以下文章

51nod1113(矩阵快速幂模板)

数论——快速幂,模运算及快速幂求逆元

Luogu 题解 P1226 [模板] 快速幂||取余运算

poj 3070 Fibonacci (矩阵快速幂乘/模板)

Raising Modulo Numbers POJ 1995(快速幂模板)

快速幂基本模板