【模板】矩阵快速幂

以洛谷P3390为例

#include
#include
typedef long long ll;
ll n,k;
const ll mod=1e9+7;
struct Matrix{
    ll num[110][110];
};
Matrix Mul(Matrix mx,Matrix my)//矩阵乘法 
{
    Matrix ret;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        ret.num[i][j]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                ret.num[i][j]=ret.num[i][j]%mod+mx.num[i][k]*my.num[k][j]%mod;
        return ret;
}
Matrix ma,dw;
Matrix Pow(Matrix x,ll y)
{
    Matrix ans=dw;
    while(y)
    {
        if(y&1)ans=Mul(ans,x);
        y>>=1;
        x=Mul(x,x);
    }
    return ans;
} 
int main()
{   
    //freopen("testdata(2).in","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            scanf("%lld",&ma.num[i][j]);
    for(int i=1;i<=n;i++)
    dw.num[i][i]=1;
    Matrix ans=Pow(ma,k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            printf("%lld ",ans.num[i][j]%mod);
        printf("\n");
    }
    return 0;
}

你可能感兴趣的:(快速幂,模板)