线性代数(矩阵乘法):POJ 3233 Matrix Power Series

Posted 既然选择了远方,便只顾风雨兼程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性代数(矩阵乘法):POJ 3233 Matrix Power Series相关的知识,希望对你有一定的参考价值。

Matrix Power Series
 

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

  一道比较有意思的水题,水一水更健康!
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5 const int maxn=50;
 6 int mod,n,K;
 7 struct Matrix{
 8     int mat[maxn][maxn];
 9     Matrix(){
10         memset(mat,0,sizeof(mat));
11     }
12     
13     Matrix operator +(Matrix a){
14         Matrix r;
15         for(int i=1;i<=n;i++)
16             for(int j=1;j<=n;j++)
17                 (r.mat[i][j]=(mat[i][j]+a.mat[i][j])%mod)%=mod;
18         return r;        
19     }
20     
21     Matrix operator *(Matrix a){
22         Matrix r;
23         for(int i=1,s;i<=n;i++)
24             for(int k=1;k<=n;k++){
25                 s=mat[i][k];
26                 for(int j=1;j<=n;j++)
27                     (r.mat[i][j]+=(s*a.mat[k][j])%mod)%=mod;        
28             }
29         return r;    
30     }
31     
32     Matrix operator ^(int k){
33         Matrix r,x;
34         for(int i=1;i<=n;i++)
35             r.mat[i][i]=1;
36         for(int i=1;i<=n;i++)
37             for(int j=1;j<=n;j++)
38                 x.mat[i][j]=mat[i][j];
39         while(k){
40             if(k&1)
41                 r=r*x;
42             k>>=1;
43             x=x*x;    
44         }        
45         return r;
46     }
47 }A,B,ans;
48 Matrix Solve(int k){
49     if(k==1)return A;
50     if(k%2)return A+A*Solve(k-1);
51     else return ((A^(k/2))+B)*Solve(k/2);
52 }
53 int main(){
54 #ifndef ONLINE_JUDGE
55     //freopen("","r",stdin);
56     //freopen("","w",stdout);    
57 #endif
58     scanf("%d%d%d",&n,&K,&mod);
59     for(int i=1;i<=n;i++)
60         for(int j=1;j<=n;j++)
61             scanf("%d",&A.mat[i][j]);
62     
63     for(int i=1;i<=n;i++)
64         B.mat[i][i]=1;
65     
66     ans=Solve(K);
67     
68     for(int i=1;i<=n;i++){
69         for(int j=1;j<=n;j++)
70             printf("%d ",ans.mat[i][j]);
71         printf("\n");    
72     }
73     return 0;
74 }

 

以上是关于线性代数(矩阵乘法):POJ 3233 Matrix Power Series的主要内容,如果未能解决你的问题,请参考以下文章

poj3233(Matrix Power Series)解题报告

线性代数(矩阵乘法):POJ 2778 DNA Sequence

poj 3233(矩阵快速幂)

POJ - 3233 矩阵套矩阵

poj3233(矩阵快速幂的和)

POJ3233 Matrix Power Series