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 }
HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律),布布扣,bubuko.com
HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)
原文:http://www.cnblogs.com/huzhenbo113/p/3928941.html