普及线代(未完勿看)

参考资料1
参考资料2


矩阵乘法常数优化

inline mat operator*(const mat& T) const {
	mat res;
	int r;
	for (int i = 0; i < sz; ++i)
		for (int k = 0; k < sz; ++k) {
			r = a[i][k];
			for (int j = 0; j < sz; ++j) res.a[i][j] += T.a[k][j] * r;
			res.a[i][j] %= MOD;
		}
	return res;
}

矩阵与线段树

「THUSCH 2017」大魔法师

练矩阵的基础题。
解这题用到的最重要知识的就是 矩阵乘法满足对加法的分配率
于是就可以像维护区间向量和了。
题面传送门
常数极大的代码


计算矩阵行列式

定义

矩阵 \(A_{i,j}\) 的行列式 \(det(A)\) 定义如下

\[det(A) = \sum_p (-1)^{\mu(p)} \prod_{i=1}^n A_{i,p_i} \]

其中, \(p\) 为一个排列, \(\mu(p)\) 为排列 \(p\) 的逆序对数。

性质

  1. 单位矩阵的行列式为 \(1\)

  2. 交换矩阵的两行, 行列式乘以 \(-1\)

  3. 某行乘以数 \(t\), 行列式乘以 \(t\)

  4. \[det(\left[\begin{matrix}a + a' \ \ \ \ b + b' \\c \ \ \ \ d\end{matrix}\right])= det(\left[\begin{matrix}a \ \ \ \ b \\c \ \ \ \ d\end{matrix}\right]) + det(\left[\begin{matrix}a' \ \ \ \ b' \\c \ \ \ \ d\end{matrix}\right]) \]

  5. 若矩阵有两行一样, 则行列式为 \(0\)

  6. 给矩阵的一行加上同一矩阵另一行(不包括本行)的倍数,行列式不变。

计算方法

将矩阵套高消板子消成上三角矩阵, 消元过程中顺便记录初等行变换对矩阵行列式的影响, 最后上三角矩阵的主对角线乘积再乘上影响就是原矩阵的行列式了。


带取模高消

取模高消很方便, 把除法换成逆元就好了。
不会gcd高消啊啊啊啊啊


矩阵树定理

无向无权

设一张图的 \(A\) 为邻接矩阵, \(D\) 为度数矩阵(\(D_{i,i}\) 为点 \(i\) 度数, 其它为 \(0\)), 则此图的 拉普拉斯矩阵 | 导纳矩阵 | 基尔霍夫矩阵 | 离散拉普拉斯算子

\[K = D - A \]

随便选一个 \(1 \le x \le n\)\(n\) 为矩阵行数), 将 \(K\) 的第 \(x\) 行和第 \(x\) 列删掉, 把剩下的行和列以相对位置不变的形式拼起来, 得到 \(K'\),最后 \(det(K')\) 就是原图的生成数个数。

这个方法可以处理重边。
(由于自环不会出现在树中, 所以自环去掉就好啦)

可以看看 VFK 的证明

扩展1:边带权

给定一张图,此图的一棵生成树的权值定义为其边集中所有边权的乘积, 问所有生成树的权值和。
一条边权为 \(w\) 的边拆成 \(w\) 条不带边权的边就好了。

扩展2:有向图

求外向树个数:
\(D_{i,i}\) 变为点 \(i\) 入度。
求内向树个数:
\(D_{i,i}\) 变为点 \(i\) 出度。

去掉哪一行哪一列就是以哪个点为根。

洛谷的板子

线性基

posted @ 2020-06-24 21:45  xwmwr  阅读(394)  评论(0编辑  收藏  举报