二分+快速幂
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=33;
int n,k,mod;
typedef struct matrix
{
int data[maxn][maxn],size;
matrix(int n)
{
size=n;
memset(data,0,sizeof(data));
for(int i=1;i<=n;i++)
data[i][i]=1;
}
matrix operator + (const matrix &xx) const
{
matrix ans(size);
for(int i=1;i<=size;i++)
for(int j=1;j<=size;j++)
{
ans.data[i][j]=data[i][j]+xx.data[i][j];
ans.data[i][j]%=mod;
}
return(ans);
}
matrix operator * (const matrix &xx) const
{
matrix ans(size);
memset(ans.data,0,sizeof(ans.data));
for(int p=1;p<=size;p++)
for(int q=1;q<=size;q++)
for(int i=1;i<=size;i++)
{
ans.data[p][q]+=data[p][i]*xx.data[i][q];
ans.data[p][q]%=mod;
}
return(ans);
}
void prin()
{
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
printf("%d ",data[i][j]);
printf("\n");
}
}
};
matrix cal(matrix a,int k)
{
matrix ans(n);
while(k)
{
if(k&1)
ans=ans*a;
k>>=1;
a=a*a;
}
// ans.prin();
return(ans);
}
matrix work(matrix a,int k)
{
matrix ans(n),E(n);
if(k==1)
{
return(a);
}
ans=work(a,k/2);
ans=ans*(cal(a,k/2)+E);
if(k&1)
return(ans*a+a);
else
return(ans);
}
int main()
{
scanf("%d %d %d",&n,&k,&mod);
matrix a(n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a.data[i][j]);
matrix ans(n);
ans=work(a,k);
ans.prin();
return 0;
}