矩阵乘法、矩阵快速幂模板
我们学校大一不开线代,多捞啊。做题时碰到了一些诸如矩阵快速幂、向量混合积之类需要线代知识的问题就很难受。
自己问同学+百度稍微了解了一点,先写一下矩阵乘法和矩阵快速幂的模板,普适性还是太低,以后慢慢改吧。
注意要输入矩阵的行列和元素。
1 struct mat{ 2 int r,c; //row,行数;column,列数 3 ll m[10][10]; //矩阵 以下写法适用于下标从0开始 到时候行列数要具体分析 4 void clear(){ //置零 5 for(int i=0;i<r;i++) memset(m[i],0,sizeof(m[i])); 6 } 7 }; 8 9 mat matmult(mat m1,mat m2){ //仅当m1.c==m2.r时可以相乘,相乘时可看情况加模运算 10 mat tmp; 11 tmp.r=m1.r; //计算结果的行数与m1行数相等,列数与m2列数相等 12 tmp.c=m2.c; 13 int i,j,k; 14 for(i=0;i<tmp.r;i++) 15 for(j=0;j<tmp.c;j++){ 16 tmp.m[i][j]=0; 17 for(k=0;k<m1.c;k++) 18 tmp.m[i][j]+=((m1.m[i][k]*m2.m[k][j])%mod)%mod; 19 } 20 21 return tmp; 22 } 23 24 mat matpow(mat a,ll n){ 25 mat ans=a; ans.clear(); 26 for(int i=0;i<ans.r;i++) ans.m[i][i]=1;//置为单位矩阵 27 while(n){ 28 if(n&1) ans=matmult(ans,a); 29 a=matmult(a,a); 30 n>>=1; 31 } 32 return ans; 33 }
Stay Hungry, Stay Foolish