首页 > 其他 > 详细

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

时间:2014-08-22 12:45:36      阅读:418      评论:0      收藏:0      [点我收藏+]

http://acm.hdu.edu.cn/showproblem.php?pid=4965

利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过。

bubuko.com,布布扣
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<iostream>
 4 #include<stdio.h>
 5 #define N 1010
 6 #define M 1010
 7 #define K 6
 8 using namespace std;
 9 struct matrix
10 {
11     int m[N][M];
12     int row,col;
13 };
14 matrix A,B,C,ANS;
15 matrix t;
16 matrix &matrix_mul(matrix &a,matrix &b,int p)//a,b矩阵相乘每个数模p
17 {
18     for(int i=0;i<a.row;i++)
19             for(int j=0;j<b.col;j++)
20                 t.m[i][j]=0;
21     t.row=a.row;
22     t.col=b.col;
23     for(int i=0;i<a.row;i++)
24         for(int k=0;k<a.col;k++)
25         {
26             for(int j=0;j<b.col;j++)
27                 t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%p;
28         }
29     return t;
30 }
31 
32     matrix ans;
33 matrix &fast_matrixt_mul_mod(matrix &a,int b,int p)//矩阵a的b次方模p
34 {
35     for(int i=0;i<N;i++)
36         for(int j=0;j<M;j++)
37         if(i==j)ans.m[i][j]=1;
38         else ans.m[i][j]=0;
39     ans.row=a.row;
40     ans.col=a.col;
41         //cout<<"=="<<endl;
42     while(b)
43     {
44         if(b&1)
45         {
46             b--;
47             ans=matrix_mul(ans,a,p);//ans=ans*a%m;
48         }
49         else
50         {
51             b/=2;
52             a=matrix_mul(a,a,p);//a=a*a%m;
53         }
54     }
55     return ans;
56 }
57 int main()
58 {
59     int n,k;
60     while(scanf("%d%d",&n,&k),n!=0||k!=0)
61     {
62         for(int i=0;i<n;i++)
63         {
64             for(int j=0;j<k;j++)
65                 scanf("%d",&A.m[i][j]);
66         }
67         A.row=n;
68         A.col=k;
69         for(int i=0;i<k;i++)
70         {
71             for(int j=0;j<n;j++)
72                 scanf("%d",&B.m[i][j]);
73         }
74         B.row=k;
75         B.col=n;
76         C=matrix_mul(B,A,6);
77         C=fast_matrixt_mul_mod(C,n*n-1,6);
78         ANS=matrix_mul(A,C,6);
79         ANS=matrix_mul(ANS,B,6);
80         int sum=0;
81         for(int i=0;i<n;i++)
82         {
83             for(int j=0;j<n;j++)
84             sum+=(ANS.m[i][j]%6);
85         }
86         printf("%d\n",sum);
87     }
88     return 0;
89 }
View Code

 

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律),布布扣,bubuko.com

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

原文:http://www.cnblogs.com/huzhenbo113/p/3928941.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!