高斯消元的线性技巧
朴素的高斯消元是 $\mathcal{O}(n^3)$ 的,算法原理参考 浅谈高斯消元
而在一些题目中,比如 洛谷P5516 [MtOI2019] 小铃的烦恼 ,实际上我们有一种线性的技巧。
设 $a_i,b_i,c_i$ 都是关于 $i$ 的函数或常数,$k$ 为常数,递推式(通常是概率或者期望的dp式子)
所对应的矩阵形如
方便起见,我们先把系数的负号去了
用第一行消第二行的 $x_2$
干脆把第二个系数也去掉
以此类推,我们可以将整个矩阵转变成
其中 $k_n$ 是 $\mathcal{O}(1)$ 可以算出的,根据之前的 $k$ 。
那么高斯消元的过程就变简单了。我们只需要两个数组 $k_i$ 和 $d_i$ 。
过程比朴素的高斯消元简单多了,只需要扫一遍,时间复杂度 $\mathcal{O}(n)$ 。
实现代码的话参考一开始给的题目链接即可。