矩阵快速幂

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\n",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;
}

 

posted on 2019-02-26 14:12  Esquecer  阅读(123)  评论(0编辑  收藏  举报

导航