矩阵乘法
定义
俩矩阵 \(A,B\),一个 \(m*n\),一个 \(n*u\)
\(C=A*B\) 计算公式为
\[c[i][j]=\sum^{n-1}_{k=0}{a[i][k]*b[k][j]}
\]
-
如果行数和列数相同的矩阵,可以称为方阵
-
如果方阵的对角线元素是 \(1\),其余元素都是 \(0\),那么这样的方阵就是单位矩阵,记为 \(I\)。
我们把矩阵写出来
不要忘记
#define int long long
#define P 998244353
封装一下
#define MN 10
struct mat {
int r, c, d[MN][MN];
mat(int rr,int cc,int isI) {
r=rr, c=cc;
memset(d,0,sizeof(d));
if(isI) for(int i=0; i<r; ++i) d[i][i]=1;
}
};
矩阵乘法,\(O(n^3)\)
mat operator*(const mat &a,const mat &b) {
mat c(a.r,b.c,0);
for(int i=0; i<a.r; ++i)
for(int j=0; j<b.c; ++j)
for(int k=0; k<a.c; ++k)
c.d[i][j]=(c.d[i][j]+a.d[i][k]*b.d[k][j])%P;
return c;
}
矩阵快速幂
mat powmat(mat a,int b) {
mat res(a.r,a.c,1);
for( ; b; b>>=1) {
if(b&1) res=res*a;
a=a*a;
}
return res;
}
那么这玩意干啥用(??
我们可以把递推的系数写进去乘