码迷,mamicode.com
首页 > 其他好文 > 详细

快速幂模板

时间:2017-12-03 18:55:22      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:ase   sig   multi   a*   quick   while   max   str   sign   

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

  

快速幂模板

标签:ase   sig   multi   a*   quick   while   max   str   sign   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!