矩阵乘法

定义

俩矩阵 \(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;
}

那么这玩意干啥用(??

我们可以把递推的系数写进去乘

posted @ 2023-08-12 22:52  Hypoxia571  阅读(14)  评论(0编辑  收藏  举报