普及线代(未完勿看)
矩阵乘法常数优化
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)\) 定义如下
其中, \(p\) 为一个排列, \(\mu(p)\) 为排列 \(p\) 的逆序对数。
性质
-
单位矩阵的行列式为 \(1\)
-
交换矩阵的两行, 行列式乘以 \(-1\)
-
某行乘以数 \(t\), 行列式乘以 \(t\)
-
\[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]) \]
-
若矩阵有两行一样, 则行列式为 \(0\)
-
给矩阵的一行加上同一矩阵另一行(不包括本行)的倍数,行列式不变。
计算方法
将矩阵套高消板子消成上三角矩阵, 消元过程中顺便记录初等行变换对矩阵行列式的影响, 最后上三角矩阵的主对角线乘积再乘上影响就是原矩阵的行列式了。
带取模高消
取模高消很方便, 把除法换成逆元就好了。
不会gcd高消啊啊啊啊啊
矩阵树定理
无向无权
设一张图的 \(A\) 为邻接矩阵, \(D\) 为度数矩阵(\(D_{i,i}\) 为点 \(i\) 度数, 其它为 \(0\)), 则此图的 拉普拉斯矩阵 | 导纳矩阵 | 基尔霍夫矩阵 | 离散拉普拉斯算子 为
随便选一个 \(1 \le x \le n\) (\(n\) 为矩阵行数), 将 \(K\) 的第 \(x\) 行和第 \(x\) 列删掉, 把剩下的行和列以相对位置不变的形式拼起来, 得到 \(K'\),最后 \(det(K')\) 就是原图的生成数个数。
这个方法可以处理重边。
(由于自环不会出现在树中, 所以自环去掉就好啦)
扩展1:边带权
给定一张图,此图的一棵生成树的权值定义为其边集中所有边权的乘积, 问所有生成树的权值和。
一条边权为 \(w\) 的边拆成 \(w\) 条不带边权的边就好了。
扩展2:有向图
求外向树个数:
\(D_{i,i}\) 变为点 \(i\) 入度。
求内向树个数:
\(D_{i,i}\) 变为点 \(i\) 出度。
去掉哪一行哪一列就是以哪个点为根。