首页 > 代码库 > HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)
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 matrix10 {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矩阵相乘每个数模p17 {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次方模p34 {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 else50 {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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。