zoukankan      html  css  js  c++  java
  • 矩阵快速幂

    typedef vector<int> vec;
    typedef vector<vec> mat;
    typedef long long ll;
    const int M = 10000;
     
    mat mul(mat &A,mat &B){
        mat C(A.size(),vec(B[0].size()));
        for(int i = 0; i < A.size(); i++){
            for(int j = 0; j < B[0].size(); j++){
                for(int k = 0; k < B.size(); k++){
                    C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % M;
                }
            }
        }
        return C;
    }
    mat pow(mat A,ll n){
        mat B(A.size(),vec(A.size()));
        for(int i = 0; i < A.size(); i++){
            B[i][i] = 1;
        }
        while(n){
            if(n & 1){
                B = mul(B,A);
            }
            A = mul(A,A);
            n >>= 1;
        }
        return B;
    }
    ll n;
    void solve()
    {
        mat A(2, vec(2));
        A[0][0] = 1; A[0][1] = 1;
        A[1][0] = 1; A[1][1] = 0;
        A = pow(A, n);
        printf("%d
    ",A[1][0]);
    } 

    自用

    const LL MOD = 1e9+7;
    struct mat{
        LL a[10][10];
    };
    mat mat_mul(mat x,mat y,int len){
        mat res;
        memset(res.a,0,sizeof(res.a));
        for(int i = 0 ; i < len ; i ++){
            for(int j = 0 ; j < len ;j ++){
                for(int k = 0 ; k < len ;k ++)
                    res.a[i][j] = (res.a[i][j] + (x.a[i][k]*y.a[k][j]*1LL)%MOD)%MOD;
            }
        }
        return res;
    }
    mat mat_qpow(mat a,LL b,int len){
        mat ans;
        memset(ans.a,0,sizeof(ans.a));
        for(int i = 0 ;i < len ; i ++) ans.a[i][i] = 1LL;
        while(b){
            if(b&1) ans = mat_mul(ans,a,len);
            a = mat_mul(a,a,len);
            b>>=1;
        }
        return ans;
    }
  • 相关阅读:
    Linux下编译安装redis
    docker搭建swoole的简易的聊天室
    Linux下面安装swoole
    laravel命令
    史上最污技术解读,60 个 IT 术语我竟然秒懂了.....
    redis集群搭建
    Windows安装MongoDB
    十大经典排序算法(动图演示)
    消息中间件基础
    laravel邮件发送
  • 原文地址:https://www.cnblogs.com/Esquecer/p/10436972.html
Copyright © 2011-2022 走看看