传送门:http://poj.org/problem?id=3233
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int k,n,m;
struct matrix
{
int m[31][31];
void init()
{
memset(m,0,sizeof(m));
for(int i=0;i<31;i++)
m[i][i]=1;
}
};
matrix mul(matrix a,matrix b)
{
int i,j,k;
matrix c;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
c.m[i][j]=0;
for(k=0;k<n;k++)
c.m[i][j]+=(a.m[i][k]*b.m[k][j])%m;
c.m[i][j]%=m;
}
}
return c;
}
matrix add(matrix a,matrix b)
{
matrix c;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
c.m[i][j]=(a.m[i][j]+b.m[i][j])%m;
}
return c;
}
matrix quickpow(matrix m,int n)
{
matrix b;
b.init();
while(n>=1)
{
if(n&1)
b=mul(b,m);
n=n>>1;
m=mul(m,m);
}
return b;
}
matrix sum(matrix s,int k)
{
matrix ans;
ans.init();
if(k==1)
return s;
ans=add(ans,quickpow(s,k/2));
ans=mul(ans,sum(s,k/2));
if(k&1)
ans=add(ans,quickpow(s,k));
return ans;
}
int main()
{
matrix p,s;
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
for(int a=0;a<n;a++)
for(int j=0;j<n;j++)
{
scanf("%d",&p.m[a][j]);
}
s=sum(p,k);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(j==n-1)
printf("%d\n",s.m[i][j]);
else
printf("%d ",s.m[i][j]);
}
}
return 0;
}