版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
int n,m;
struct Mat
{
ll a[102][102];
};
Mat s,B;
Mat matrixmul(Mat a,Mat b)//矩阵乘法
{
Mat c;
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
{
c.a[i][j]=0;
for(int k=1; k<=n; k++)
c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
c.a[i][j]%=mod;
}
return c;
}
Mat mul(Mat s,int k)//矩阵快速幂
{
Mat ans;
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
ans.a[i][j]=(i==j)?1:0;
while(k)
{
if(k&1)
ans=matrixmul(ans,s);
k>>=1;
s=matrixmul(s,s);
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
Mat s;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
scanf("%I64d",&s.a[i][j]);
}
s=mul(s,m);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
printf("%I64d",(s.a[i][j]+mod)%mod);
if(j!=n)
printf(" ");
}
printf("\n");
}
}