解题思路:详见挑战p205
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
struct mat
{
int s[62][62],n;
mat()
{
memset(s,0,sizeof(s));
}
};
mat p;
int m;
mat mult(mat a,mat b)
{
mat c;
int n=a.n;
c.n=a.n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int r=0;
for(int q=0;q<n;q++)
{
r+=a.s[i][q]*b.s[q][j];
r%=m;
//printf("%d %d %d\n",i,j,q);
}
c.s[i][j]=r;
}
}
return c;
}
void solve(int n,int k)
{
mat a,t;
t=p;
for(int i=0;i<n*2;i++)
a.s[i][i]=1;
a.n=2*n;
while(k)
{
if(k&1)
{
a=mult(a,t);
}
k>>=1;
t=mult(t,t);
}
mat c;
c.n=n;
for(int i=n;i<n+n;i++)
for(int j=0;j<n;j++)
c.s[i-n][j]=a.s[i][j];
c=mult(c,p);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%d ",c.s[i][j]);
}
printf("\n");
}
}
int main()
{
//freopen("t.txt","r",stdin);
int n,k;
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&p.s[i][j]);
}
}
for(int i=0;i<n;i++)
{
p.s[i+n][i]=p.s[i+n][i+n]=1;
}
p.n=n*2;
/*for(int i=0;i<2*n;i++)
{
for(int j=0;j<2*n;j++)
{
printf("%d ",p.s[i][j]);
}
printf("\n");
}*/
solve(n,k);
}
return 0;
}