矩阵快速幂(模板)

typedef struct
{
    int m[maxn][maxn];
}Matrax;

Matrax a,per;

int n,M;

void init()
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            scanf("%d",&a.m[i][j]);
            a.m[i][j]%=M;
            per.m[i][j]=(i==j);
        }
}

Matrax multi(Matrax a,Matrax b)
{
    Matrax c;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            c.m[i][j]=0;
            for(int k=0;k<n;k++)
                c.m[i][j]+=a.m[i][j]*b.m[i][j];
            c.m[i][j]%=M;
        }
    return c;
}

Matrax power(int k)
{
    Matrax c,p,ans=per;
    p=a;
    while(k){
        if(k&1)
            ans=multi(ans,p);
        k>>=1;
        p=multi(p,p);
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/qq_40679299/article/details/80314290