首页 > 代码库 > 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 }
View Code