……

矩阵乘法、矩阵快速幂模板

我们学校大一不开线代,多捞啊。做题时碰到了一些诸如矩阵快速幂、向量混合积之类需要线代知识的问题就很难受。

自己问同学+百度稍微了解了一点,先写一下矩阵乘法和矩阵快速幂的模板,普适性还是太低,以后慢慢改吧。

注意要输入矩阵的行列和元素。

 

 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 }

 

posted @ 2019-01-31 16:22  noobimp  阅读(180)  评论(0编辑  收藏  举报