【题意】给定n*n的矩阵A和正整数k和m。求矩阵A的幂的和!
【解题方法】可以参见《挑战程序设计》205页!
【AC代码】
//POJ.3233
//Matrix Power Series
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct Matrix{
int a[62][62];
}A;
int n,k,m;
Matrix operator*(const Matrix &a,const Matrix &b)
{
Matrix c;
for(int i=0; i<2*n; i++)
{
for(int j=0; j<2*n; j++)
{
c.a[i][j]=0;
for(int k=0; k<2*n; k++)
{
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%m;
}
}
}
return c;
}
Matrix pow(Matrix a,int x)
{
Matrix res;
for(int i=0; i<2*n; i++)
for(int j=0; j<2*n; j++)
if(i==j) res.a[i][j]=1;else res.a[i][j]=0;
while(x)
{
if(x&1) res=res*a;
a=a*a;
x>>=1;
}
return res;
}
int main()
{
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",&A.a[i][j]);
}
}
for(int i=0; i<2*n; i++)
{
for(int j=0; j<2*n; j++)
{
if(i<n)
{
if(j<n) continue;
else A.a[i][j]=0;
}
else
{
if(j==i-n) A.a[i][j]=1;
else if(j==i) A.a[i][j]=1;
else A.a[i][j]=0;
}
}
}
A=pow(A,k+1);
for(int i=0; i<2*n; i++)
{
if(i>=n)
{
for(int j=0; j<n; j++)
{
if(i-n==j) A.a[i][j]=(A.a[i][j]-1+m)%m;
printf("%d%c",A.a[i][j],j==n-1?'\n':' ');
}
}
}
}
}