#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct matrix
{
int a[32][32];
};
int m,n;
matrix Sum(matrix x,matrix y)
{
matrix temp;
memset(temp.a,0,sizeof(temp.a));
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
temp.a[i][j]=(temp.a[i][j]+x.a[i][k]*y.a[k][j]%m)%m;
}
}
}
return temp;
}
matrix Add(matrix x,matrix final)
{
int i,j;
matrix temp;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
temp.a[i][j]=(final.a[i][j]+x.a[i][j])%m;
}
}
return temp;
}
matrix Mul(matrix c,int num)
{
matrix origin ;
int i,j;
memset(origin.a,0,sizeof(origin.a));
for(i=0;i<n;i++)
origin.a[i][i]=1;
while(num!=0)
{
if(num&1)
origin=Sum(origin,c);
c=Sum(c,c);
num>>=1;
}
return origin;
}
matrix Num(matrix x,int k)
{
matrix temp;
int i;
if(k==1)return x;
memset(temp.a,0,sizeof(temp.a));
for(i=0;i<n;i++)
temp.a[i][i]=1;
temp=Add(temp,Mul(x,k>>1));
temp = Sum(temp,Num(x,k>>1)) ;
if ( k&1 )
temp = Add(temp,Mul(x,k)) ;
return temp ;
}
int main()
{
int i,j,k;
matrix temp;
while(~scanf("%d",&n))
{
scanf("%d%d",&k,&m);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&temp.a[i][j]);
}
}
temp=Num(temp,k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j==0)
{
printf("%d",temp.a[i][j]);
}
else printf(" %d",temp.a[i][j]);
}
printf("\n");
}
}
return 0;
}
POJ3233
最新推荐文章于 2020-01-21 15:40:01 发布