POJ3233 Matrix Power Series 矩阵乘法

http://poj.org/problem?id=3233

挺有意思的..学习到结构体作为变量的转移,
题意 : 给定矩阵A,求A + A^2 + A^3 + ... + A^k的结果(两个矩阵相加就是对应位置分别相加)。输出的数据mod m。k<=10^9。
代码:
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const int maxn=10010;
 9 const double eps=1e-8;
10 int n,m;
11 struct mat{
12     int e[35][35];
13 };
14 mat plu(mat x,mat y){//相加
15     for(int i=1;i<=n;i++){
16         for(int j=1;j<=n;j++){
17             x.e[i][j]+=y.e[i][j];
18             x.e[i][j]%=m;
19         }
20     }return x;
21 }
22 mat pro(mat x,mat y){//相乘
23     mat z;
24     for(int i=1;i<=n;i++){
25         for(int j=1;j<=n;j++){
26             z.e[i][j]=0;
27             for(int k=1;k<=n;k++){
28                 z.e[i][j]+=x.e[i][k]*y.e[k][j];
29                 z.e[i][j]%=m;
30             }
31         }
32     }return z;
33 }
34 mat pow(mat x,int k){//次方
35     mat z;
36     if(k==1){
37         return x; 
38     }
39     if(k%2==0){
40         z=pow(pro(x,x),k/2);
41         return z;
42     }else{
43         z=pow(pro(x,x),k/2);
44         return pro(z,x);
45     }
46 }
47 mat doit(mat x,int k){//相加
48     if(k==1){
49         return x;
50     }
51     if(k%2==0){
52         mat z;
53         z=doit(x,k/2);
54         return plu(z,pro(z,pow(x,k/2)));
55     }else{
56         mat z,z1;
57         z=doit(x,k/2);
58         z1=pow(x,k/2);
59         return plu(plu(z,pro(z,z1)),pro(pro(z1,z1),x));
60     }
61 }
62 int main(){
63     int k;
64     mat a;
65     scanf("%d%d%d",&n,&k,&m);
66     for(int i=1;i<=n;i++){
67         for(int j=1;j<=n;j++){
68             scanf("%d",&a.e[i][j]);
69             a.e[i][j]%=m;
70         }
71     }
72     mat ans=doit(a,k);
73     for(int i=1;i<=n;i++){
74         for(int j=1;j<=n;j++){
75             ans.e[i][j]%=m;
76             printf("%d ",ans.e[i][j]);
77         }
78         cout<<endl;
79     }
80     return 0;
81 }
View Code

 

posted @ 2017-11-05 08:25  鲸头鹳  阅读(151)  评论(0编辑  收藏  举报