示例题目: POJ3233
Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 24251 Accepted: 10081
Description
Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.
Input
The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.
Output
Output the elements of S modulo m in the same way as A is given.
Sample Input
2 2 4
0 1
1 1
Sample Output
1 2
2 3
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long LL;
const int MAXN=1e4+5;
typedef vector<int> vec;
typedef vector<vec> mat;
int n,k,MOD;
mat A;
mat mul(mat &A,mat &B)
{
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();i++){
for(int k=0;k<B.size();k++){
for(int j=0;j<B[0].size();j++){
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%MOD;
}
}
}
return C;
}
mat pow(mat A,LL n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();i++) B[i][i]=1;
while(n>0)
{
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
void solve()
{
mat B(n*2,vec(n*2));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
B[i][j]=A[i][j];
}
B[n+i][i]=B[n+i][n+i]=1;
}
B=pow(B,k+1);//I+A+A^2+...+A^k
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int a=B[n+i][j]%MOD;
//减去I
if(i==j) a=(a+MOD-1)%MOD;
printf("%d%c",a,j+1==n?'\n':' ');
}
}
}
int main()
{
while(scanf("%d%d%d",&n,&k,&MOD)!=EOF)
{
A=mat(n,vec(n));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&A[i][j]);
}
}
solve();
}
return 0;
}