#include<bits/stdc++.h>
#define ll long long
#define maxn 105
#define M 1000000007
using namespace std;
ll input(){
ll ans=0;
char c=getchar();
bool flag=0;
while(c<'0'||c>'9'){
if(c=='-')flag=1;
c=getchar();
}
while(c>='0'&&c<='9'){
ans=ans*10+c-'0';
c=getchar();
}
if(flag)ans=-ans;
return ans;
}
void print(ll ans,char c=0,bool flag=1){
if(ans<0){
putchar('-');
ans=-ans;
}
if(ans>=10)print(ans/10,c,0);
putchar('0'+ans%10);
if(flag&&c!=0)putchar(c);
}
ll n,k;
class Matrix{
public:
ll v[maxn][maxn];
Matrix(){
memset(v,0,sizeof(v));
}
Matrix operator *(Matrix A){
Matrix ans;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
for(ll k=1;k<=n;k++){
ans.v[i][j]+=((v[i][k]*A.v[k][j])%M);
ans.v[i][j]%=M;
// cout<<"v["<<i<<"]["<<j<<"]="<<ans.v[i][j]<<endl;
}
}
}
return ans;
}
}m,ANS;
void Set(Matrix &ma){
for(ll i=1;i<=n;i++)ma.v[i][i]=1;
}
Matrix quickPower(Matrix d,ll z){
Matrix ans,k;
Set(ans);
if(!z)return ans;
// cout<<z<<endl;
k=quickPower(d,z/2);
// cout<<z<<endl;
if(z&1)ans=k*k*d;
else ans=k*k;
return ans;
}
int main(){
n=input();k=input();
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
m.v[i][j]=input();
}
}
ANS=quickPower(m,k);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++)print(ANS.v[i][j],' ');
putchar('\n');
}
return 0;
}
本地测
3 100
1 0 1
0 1 0
1 0 1
过不了交上去AC了什么玩意?离大谱。