矩阵快速幂模板

 

struct Matrix

{

    LL mat[MAXN][MAXN];

    int r;

    void init(int n)

    {

        memset(mat,0,sizeof(mat));

        r=n;

    }

};

Matrix matrix_mul(Matrix a,Matrix b)

{

    Matrix ans;

    ans.init(a.r);

    for(int i=0;i<a.r;i++)

        for(int j=0;j<a.r;j++)

            for(int k=0;k<a.r;k++)

                    ans.mat[i][j]+=a.mat[i][k]*b.mat[k][j];

    return ans;

}

Matrix maxtrix_pow(Matrix a,LL n,int r)

{

    Matrix ans;

    ans.initr(r);

    for(int i=0;i<r;i++) ans.mat[i][i]=1;

    while(n)

    {

        if(n&1) ans=matrix_mul(ans,a);

        n>>=1;

        a=matrix_mul(a,a);

    }

    return ans;

}

你可能感兴趣的:(模板)