快速幂模板

//快速幂
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;
}

  

原文地址:https://www.cnblogs.com/imzscilovecode/p/7966676.html