本题地址:>here<
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
Source
POJ Monthly–2007.06.03, Huang, Jinsong
题解
很明显这是个水题
就是那个…矩阵的累乘和
自行百度(原谅我不会搞数学符号)
时间复杂度是O(n³log k)
#include <cstdio>
#include <vector>
using namespace std;
typedef vector<int> vec;
typedef vector<vec> mat;
int m;
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])%m;
return C;
}
mat pow(mat A,int 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;
}
int n,k;
mat A;
int main() {
scanf("%d%d%d",&n,&k,&m);
mat B(n*2,vec(n*2));
for(int i=0;i<n;i++) {
vector<int> a;
for(int j=0;j<n;j++) {
int t;
scanf("%d",&t);
a.push_back(t);
}
A.push_back(a);
}
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);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
int a=B[n+i][j]%m;
if(i==j) a=(a+m-1)%m;
printf("%d%c",a,j==n-1?'\n':' ');
}
return 0;
}