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

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

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

 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

 

转载于:https://www.cnblogs.com/huzhenbo113/p/3928941.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值