模板题。。。。
下面附上代码:
# include<cstdio>
# include<cstring>
using namespace std;
#define NUM 50
int k,n,m;
struct Matrix
{
int a[NUM][NUM];
void init()
{
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
a[i][i]=1;
}
} A;
Matrix mul(Matrix a,Matrix b)
{
Matrix ans;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
ans.a[i][j]=0;
for(int k=0;k<n;k++)
ans.a[i][j]+=a.a[i][k]*b.a[k][j];
ans.a[i][j]%=m;
}
return ans;
}
Matrix add(Matrix a,Matrix b)
{
int i,j,k;
Matrix ans;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
ans.a[i][j]=a.a[i][j]+b.a[i][j];
ans.a[i][j]%=m;
}
return ans;
}
Matrix pow(Matrix a,int n)
{
Matrix ans;
ans.init();
while(n)
{
if(n%2)
ans=mul(ans,a);
n/=2;
a=mul(a,a);
}
return ans;
}
Matrix sum(Matrix a,int n)
{
int m;
Matrix ans,pre;
if(n==1)
return a;
m=n/2;
pre=sum(a,m);
ans=add(pre,mul(pre,pow(a,m)));
if(n&1)
ans=add(ans,pow(a,n));
return ans;
}
int main()
{
Matrix ans;
scanf("%d%d%d",&n,&k,&m);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&A.a[i][j]);
A.a[i][j]%=m;
}
ans=sum(A,k);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
printf("%d%c",ans.a[i][j],j==n-1?'\n':' ');
return 0;
}