矩阵快速幂模板

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;
}