035.快速幂模板

模板

快速幂

luogu P1226

long long qpow(long long base,long long e){
    long long ans=1;
    long long b=base;
    while(e){
        if(e&1)ans*=b;
        b*=b;
        e>>=1;
    }
    return ans;
}
long long qpow(long long base,long long e,long long mod){
    long long ans=1;
    long long b=base%mod;
    while(e){
        if(e&1)ans=ans*b%mod;
        b=b*b%mod;
        e>>=1;
    }
    return ans;
}

矩阵快速幂

luogu P3390

vector<vector<long long>>mat_mult(vector<vector<long long>>&A,vector<vector<long long>>&B,int n){
    vector<vector<long long>>C(n,vector<long long>(n));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                C[i][j]+=A[i][k]*B[k][j];            
            }
        }
    }return C;
}

vector<vector<long long>>quick_power(vector<vector<long long>>base,int n,long long e){
    vector<vector<long long>>result(n,vector<long long>(n));
    for(int i=0;i<n;++i){result[i][i]=1;}
    while(e){
        if(e&1){
            result=mat_mult(result,base,n);
        }
        base=mat_mult(base,base,n);
        e>>=1;
    }return result;
}

vector<vector<long long>>mat_mult(vector<vector<long long>>&A,vector<vector<long long>>&B,int n,long long mod){
    vector<vector<long long>>C(n,vector<long long>(n));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                C[i][j]=(C[i][j]+A[i][k]*B[k][j])%mod;            
            }
        }
    }return C;
}

vector<vector<long long>>quick_power(vector<vector<long long>>base,int n,long long e,long long mod){
    vector<vector<long long>>result(n,vector<long long>(n));
    for(int i=0;i<n;++i){result[i][i]=1;}
    while(e){
        if(e&1){
            result=mat_mult(result,base,n,mod);
        }
        base=mat_mult(base,base,n,mod);
        e>>=1;
    }return result;
}

posted @ 2026-01-05 22:28  射杀百头  阅读(6)  评论(0)    收藏  举报