高斯消元
如果你可以肯定我的一片心意
如果你可以回应我的一个问题
如果你愿意相信我们这份默契
就让我们用生命许下这个约定
——洛天依《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\) 而且常数极小做完了。
天依宝宝可爱!
矩阵求逆
结论:对一个 \(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\),再在常数列同时减去这个值就可以了。
天依宝宝可爱!
洛谷 P2973
思维难度:\(\color{#F39C11} 橙\) *1100
一眼题。写个期望 dp 转移式子发现有环而且 \(n\) 只有 \(300\) 直接上高消做完了。
天依宝宝可爱!
洛谷 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_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\) 个,所以:
但是注意到 \(k\) 很大,所以不能直接求,所以考虑递推。经过一番推式子,可以得到:
直接递推就完了。
但是这个题还没完。可以发现 \(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)\)。
天依宝宝可爱!

浙公网安备 33010602011771号