高斯消元

如果你可以肯定我的一片心意

如果你可以回应我的一个问题

如果你愿意相信我们这份默契

就让我们用生命许下这个约定

——洛天依《I LOVE U》


高斯消元

一个 \(O(n^3)\) 的解线性方程组的工具,但是常常被一些特殊情况优化到 \(O(n^2)\)

天依宝宝可爱!


洛谷 P2447

思维难度:\(\color{#F39C11} 橙\) *1000

注意到高斯消元 \(O(n^3)\) 的部分在 \(\bmod 2\) 意义下,消元过程可以简化为 \(a_i \gets a_i \oplus a_r\),所以二分答案 \(O(\frac {n^2m} w \log (m-n)) \approx 1.5 \times 10^8\) 而且常数极小做完了。

submission

天依宝宝可爱!


矩阵求逆

结论:对一个 \(n \times 2n\) 的矩阵 \(A|I\)(就是在 \(A\) 右边拼一个单位矩阵)进行消元(消到对角元),最终会得到矩阵 \(I|A^{-1}\)。如果不满秩则 \(A\) 没有逆元。

满秩即高消过程完整进行了 \(n\) 轮即 \(r-1 = n\)

证明:不会。

据说模数不是质数的时候,可以通过辗转相除法求矩阵的逆,不过我不会。


洛谷 P3164

思维难度:\(\color{#F39C11} 橙\) *1000

显然可以表示成 \(n \times m\) 个可变元和 \(n \times m\) 个异或方程。

然后解方程,如果无穷解则任意构造一组解。因为题目要求不能全为 \(0\),所以自由元直接赋 \(1\) 就可以了。

关于构造,直接在高消的过程中把给自由元赋的值代进去,把所有不为 \(0\) 的位置减掉自己变成 \(0\),再在常数列同时减去这个值就可以了。

submission

天依宝宝可爱!


洛谷 P2973

思维难度:\(\color{#F39C11} 橙\) *1100

一眼题。写个期望 dp 转移式子发现有环而且 \(n\) 只有 \(300\) 直接上高消做完了。

submission

天依宝宝可爱!


洛谷 P4457

思维难度:\(\color{#52C41A} 绿\) *1900

怎么是黑题,但感觉好容易的样子(?

估计不久就降紫了吧。不过也算是半个首黑了。

显然那 \(m\) 个人都是假人,一轮操作的一个步骤实际上就是以 \(\frac 1 {m+1}\) 的概率加血 / 扣血。

求血量降为 \(0\) 的期望步数,一个套路的想法就是令 \(g_i\) 为血量 \(i \to 0\) 的期望步数。不难发现 \(g_i\) 可以从 \(g_i\) 前面的一些位置转移过来,转移的概率就是经过一轮操作扣了 \(x\) 滴血的概率,于是令 \(f_i\) 为一轮操作扣 \(i\) 滴血的概率。不过注意到还有加血的可能,不过此时的概率也是确定的,毕竟加血最多一次嘛,概率为 \(\frac 1 {m+1}\)。考虑是否加血、从哪里转移,很自然地写出转移式:

\[g_i = \left( \frac 1 {m+1} \sum _{j=0} ^{i+1} f_{i+1-j} \times g_j + \frac m {m+1} \sum _{j=0} ^i f_{i-j} \times g_j \right) + 1 \]

但是 \(g_n\) 不能加血,所以需要特判 \(g_n\) 就只有后面那一半了。

初始状态是 \(g_0 = 0\)

发现 \(f\) 还没有求,不过求 \(f\) 是容易的,考虑把是否扣血变成一个 \(01\) 序列,那么 \(f_i\) 就等价于序列中有 \(i\)\(1\) 出现的概率,显然一个这样的序列出现概率为 \((\frac 1 {m+1})^i \times (\frac m {m+1})^{k-i}\),然后这样的序列一共有 \(\binom k i\) 个,所以:

\[f_i = \binom k i \times (\frac 1 {m+1})^i \times (\frac m {m+1})^{k-i} \]

但是注意到 \(k\) 很大,所以不能直接求,所以考虑递推。经过一番推式子,可以得到:

\[f_i = \frac {k-i+1} {m \times i} f_{i-1} \]

直接递推就完了。

但是这个题还没完。可以发现 \(g_i\) 的转移实际上是存在环的,所以要高消。但是注意到数据范围 \(n \le 1500\),所以 \(O(n^3)\) 的高消是跑不过去的,需要优化掉一个 \(n\)

找找性质,可以发现 \(g_i\) 会从 \(g_{0 \sim i+1}\) 转移,也就是只有 \(0 \sim i+1\) 有系数,画出来矩阵可以发现实际上就是一个上三角(旋转 \(180 \degree\))但是每一行左边多出来一个元素。所以原本每次消元需要消 \(O(n)\) 行此时只需要消第 \(i+1\) 行了,毕竟下面的都是 \(0\)。当然这个指的是消为上三角的过程,而不能直接消为对角。因为上三角到对角显然也是 \(O(n^2)\) 的,所以总复杂度 \(O(n^2)\)

submission

天依宝宝可爱!

posted @ 2025-08-19 09:54  little__bug  阅读(6)  评论(0)    收藏  举报