![]()

#include<iostream>
#include<cstring>
using namespace std;
const int MAX=32;
struct Matrix
{
int v[MAX][MAX];
};
int n,k,M;
Matrix mtAdd(Matrix A,Matrix B)
{
Matrix C;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
C.v[i][j]=(A.v[i][j]+B.v[i][j])%M;
}
return C;
}
Matrix mtMul(Matrix A,Matrix B)
{
Matrix C;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
C.v[i][j]=0;
for(int k=0;k<n;k++)
{
C.v[i][j]=(A.v[i][k]*B.v[k][j]+C.v[i][j])%M;
}
}
return C;
}
Matrix mtPow(Matrix A,int k)
{
if(k==0)
{
memset(A.v,0,sizeof(A.v));
for(int i=0;i<n;i++)
{
A.v[i][i]=1;
}
return A;
}
if(k==1)return A;
Matrix C=mtPow(A,k/2);
if(k%2==0)
{
return mtMul(C,C);
}
else{return mtMul(mtMul(C,C),A);}
}
Matrix mtCal(Matrix A,int k)
{
if(k==1)return A;
Matrix B=mtPow(A,(k+1)/2);
Matrix C=mtCal(A,k/2);
if(k%2==0)
{
return mtMul(mtAdd(mtPow(A,0),B),C);
}
else
{
return mtAdd(A,mtMul(mtAdd(A,B),C));
}
}
int main()
{
Matrix A;
cin>>n>>k>>M;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cin>>A.v[i][j];
}
A=mtCal(A,k);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<A.v[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
![]()
![]()