Matrix Power Series
Time Limit: 3000MS | Memory Limit: 131072K | |
Total Submissions: 16512 | Accepted: 7035 |
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
这个求的是1~k次幂的A矩阵的相加即s矩阵等于S = A + A2 + A3 + … + Ak.,需要用到递归
- Source Code
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; struct node { int mp[32][32]; }init,res; int n,mod,kk; struct node add(struct node a,struct node b) { struct node c; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c.mp[i][j] = 0; c.mp[i][j] = a.mp[i][j] + b.mp[i][j]; c.mp[i][j] = c.mp[i][j]%mod; } } return c; }; struct node mult(struct node a,struct node b) { struct node c; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c.mp[i][j] = 0; for(int k=0;k<n;k++) { c.mp[i][j] += a.mp[i][k] * b.mp[k][j]; c.mp[i][j] %= mod; } } } return c; }; struct node Cal(int k) { struct node tmp = res,x = init; while(k) { if(k%2 == 1) { tmp = mult(tmp,x); } x = mult(x,x); k>>=1; } return tmp; }; struct node sum(int k) { if(k == 1) { return init; } struct node tmp,tnow; tmp = sum(k/2); if(k%2 == 1) { tnow = Cal(k/2+1); tmp = add(tmp,mult(tmp,tnow)); tmp = add(tnow,tmp); } else { tnow = Cal(k/2); tmp = add(tmp,mult(tmp,tnow)); } return tmp; }; int main() { int k; scanf("%d%d%d",&n,&kk,&mod); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&init.mp[i][j]); init.mp[i][j]%=mod; if(i == j) { res.mp[i][j] = 1; } else { res.mp[i][j] = 0; } } } struct node tt; tt = sum(kk); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j == 0) { printf("%d",tt.mp[i][j]); } else { printf(" %d",tt.mp[i][j]); } } printf("\n"); } return 0; }