就是快速幂和矩阵的结合
link Miku
#include<cstdio>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long n,k;
long long ans[101][101];
long long tem[101][101];
long long li[101][101];
long long mod=1000000007;
void tim1(){
memset(li,0,sizeof(li));
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
li[i][j]=(li[i][j]+(tem[i][k]*ans[k][j])%mod);
li[i][j]%=mod;
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
ans[i][j]=li[i][j];
}
}
return ;
}
void tim2(){
memset(li,0,sizeof(li));
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
for(int k=1;k<=n;++k){
li[i][j]=(li[i][j]+(tem[i][k]*tem[k][j])%mod);
li[i][j]%=mod;
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
tem[i][j]=li[i][j];
}
}
return ;
}
void power() {
while(k){
if(k&1){
tim1();
}
tim2();
k>>=1;
}
return ;
}
int main(){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%lld",&ans[i][j]);
tem[i][j]=ans[i][j];
}
}
k--;
power();
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}