一、基础知识
1.矩阵乘法
设A为的矩阵,B为
的矩阵,那么称
的矩阵C为矩阵A与B的乘积,记作
,其中矩阵C中的第
行第
列元素可以表示为:
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D334/sign=5e0cfe86de33c895a27e9e78e5137397/8ad4b31c8701a18bd6fe9b5e992f07082838fe8e.jpg)
1 typedef long long ll; 2 const int Mod=10000; 3 struct mat{ 4 ll a[2][2]; 5 }; 6 mat mat_mul(mat x,mat y){ 7 mat ans; 8 memset(ans.a,0,sizeof(ans.a)); 9 for (int i=0;i<2;i++){ 10 for (int j=0;j<2;j++) 11 for (int k=0;k<2;k++) 12 ans.a[i][j]=ans.a[i][j]+(x.a[i][k]*y.a[k][j])%Mod; 13 } 14 return ans; 15 }
2.矩阵快速幂
顾名思义,就是将数字的幂运算变成矩阵的幂运算。orz...直接上代码就好。
1 mat mat_mul(mat &x,mat &y,int Mod){ 2 mat ans; 3 memset(ans.a,0,sizeof(ans.a)); 4 for (int i=0;i<2*n;i++) 5 for (int j=0;j<2*n;j++) 6 for (int kk=0;kk<2*n;kk++){ 7 ans.a[i][j]+=x.a[i][kk]*y.a[kk][j]; 8 ans.a[i][j]%=Mod; 9 } 10 return ans; 11 } 12 void mat_pow(mat &res,int k,int Mod){ 13 mat c=res; 14 k--; 15 while (k){ 16 if (k&1) res=mat_mul(res,c,m); 17 k>>=1; 18 c=mat_mul(c,c,m); 19 } 20 }
二、应用(例题)
3.poj3233
4.hdoj2604
5.hdoj1757