下次再来补坑
注意一点:矩阵开long long 会超时,矩阵必须开到60+,不然会RE
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
typedef long long ll;
int g;
int mod;
struct mx{
int v[65][65];//ll会超时%因为取模,所以不需要ll
}a;
mx mul(mx a,mx t,int g){
mx res;
memset(res.v,0,sizeof(res.v));
for(int i=0;i<g;i++){
for(int j=0;j<g;j++){
for(int k=0;k<g;k++){
res.v[i][j]+=(a.v[i][k]%mod)*(t.v[k][j]%mod)%mod;
res.v[i][j]%=mod;
}
}
}
return res;
}
mx power(mx a,ll b,int g){
mx ans;
memset(ans.v,0,sizeof(ans.v));
for(int i=0;i<g;i++)ans.v[i][i]=1;
while(b>0){
if(b&1)ans=mul(ans,a,g);
b=b>>1;
a=mul(a,a,g);
}
return ans;
}
int main(){
int n;
ll k;
while(scanf("%d%lld%d",&n,&k,&mod)==3){
g=n*2;
memset(a.v,0,sizeof(a.v));
int i,j;
for(i=0;i<g;i++){
for(j=0;j<n;j++){
if(i<n)scanf("%d",&a.v[i][j]);
}
if(i<n)a.v[i][i+n]=1;
else a.v[i][i]=1;
}
/*for(int i=0;i<g;i++){
for(int j=0;j<g;j++)cout<<a.v[i][j]<<" ";
cout<<endl;
}*/
mx m=power(a,k+1,g);
for(i=0;i<n;i++){
for(j=n;j<g;j++){
if(j==i+n)m.v[i][j]=(m.v[i][j]-1+mod)%mod;
printf("%d",m.v[i][j]);//cout<<;
if(j<g-1)printf(" ");
}
printf("\n");//cout<<endl;
}
}
return 0;
}