矩阵的模板

矩阵

1.乘法

struct Matrix {
	int n, m;
	LL c[Maxn + 5][Maxn + 5];
	
	Matrix () { memset (c, 0, sizeof c); }
	void Init () {
		memset (c, 0, sizeof c);
		for (int i = 1; i <= n; i++)
			c[i][i] = 1;
	}
};
Matrix operator * (Matrix x, Matrix y) {
	Matrix ans; ans.n = x.n; ans.m = y.m;
	for (int k = 1; k <= x.m; k++)
		for (int i = 1; i <= ans.n; i++)
			for (int j = 1; j <= ans.m; j++)
				ans.c[i][j] = (ans.c[i][j] + x.c[i][k] * y.c[k][j] % Mod) % Mod;
	return ans; 
}

2.基本运算(+, -, *)

struct Matrix {
	int n, m;
	LL c[Maxn + 5][Maxn + 5];
	
	Matrix () { memset (c, 0, sizeof c); }
	
	void init () {
		for (int i = 0; i <= n; i++)
			c[i][i] = 1;
	}
	
	void cpy (LL a[][Maxn + 5]) {
		for (int i = 0; i < Maxn + 5; i++) {
			for (int j = 0; j < Maxn + 5; j++) {
				c[i][j] = a[i][j];
			}
		}
	}
	
	void read () {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				scanf ("%lld", &c[i][j]);
				c[i][j] %= Mod;
				if (c[i][j] < 0) c[i][j] += Mod;
			}
		}
	}
	
	void write () {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				printf ("%lld ", c[i][j]);
			}
			puts ("");
		}
	}
	
	Matrix operator * (const Matrix x) const {
		Matrix ans; ans.n = n; ans.m = x.m;
		for (int k = 1; k <= m; k++) {
			for (int i = 1; i <= ans.n; i++) {
				for (int j = 1; j <= ans.m; j++) {
					ans.c[i][j] += c[i][k] * x.c[k][j];
					ans.c[i][j] %= Mod;
					if (ans.c[i][j] < 0) ans.c[i][j] += Mod; 
				}
			}
		}
		return ans;
	}
	
	Matrix operator + (const Matrix x) const {
		Matrix ans; ans.n = n; ans.m = m;
		for (int i = 1; i <= n; i++)  {
			for (int j = 1; j <= m; j++) {
				ans.c[i][j] = c[i][j] + x.c[i][j];
			}
		}
		return ans;
	}
	
	Matrix operator - (const Matrix x) const {
		Matrix ans; ans.n = n; ans.m = m;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				ans.c[i][j] = c[i][j] - x.c[i][j];
			}
		}
		return ans;
	}
};

3.压行

struct Matrix {int n, m;LL map[Maxn][Maxn];Matrix () { memset (map, 0, sizeof map); }void init () {for (int i = 0; i <= n; i++)map[i][i] = 1;}void cpy (LL a[][Maxn]) {for (int i = 0; i < Maxn; i++) {for (int j = 0; j < Maxn; j++) {map[i][j] = a[i][j];}}}void read () {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf ("%lld", &map[i][j]);map[i][j] %= mod;if (map[i][j] < 0) map[i][j] += mod;}}}void write () {for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {printf ("%lld ", map[i][j]);}puts ("");}}Matrix operator * (const Matrix x) const {Matrix ans; ans.n = n; ans.m = x.m;for (int i = 1; i <= ans.n; i++) {for (int j = 1; j <= ans.m; j++) {for (int k = 1; k <= m; k++) {ans.map[i][j] += map[i][k] * x.map[k][j];ans.map[i][j] %= mod;if (ans.map[i][j] < 0) ans.map[i][j] += mod; }}}return ans;}Matrix operator + (const Matrix x) const {Matrix ans; ans.n = n; ans.m = m;for (int i = 1; i <= n; i++)  {for (int j = 1; j <= m; j++) {ans.map[i][j] = map[i][j] + x.map[i][j];}}return ans;}Matrix operator - (const Matrix x) const {Matrix ans; ans.n = n; ans.m = m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {ans.map[i][j] = map[i][j] + x.map[i][j];}}return ans;}};
posted @ 2020-10-07 19:39  C2022lihan  阅读(19)  评论(0编辑  收藏  举报