高斯消元

高斯消元

高斯消元法通常用于求解如下形式的 n 元线性方程组:

{a1,1x1+a2,2x2++a1,nxn=b1a2,1x1+a2,2x2++a2,nxn=b2an,1x1+an,2x2++an,nxn=bn

线性方程组与矩阵的联系

对于一个线性方程组:

{a1,1x1+a1,2x2++a1,nxn=b1a2,1x1+a2,2x2++a2,nxn=b2am,1x1+am,2x2++am,nxn=bn

可以表示为下面的矩阵:

[a1,1a1,2a1,nb1a2,1a2,2a2,nb2am,1am,2am,nbm]

整个矩阵称为增广矩阵,而没有右边系数的矩阵称为系数矩阵。

考虑把一个线性方程组的 n 个元的解写在一个列向量(仅含一列的矩阵)中,如:

X=[x1x2xn]

于是可以得到向量方程 AX=B

解线性方程组

P3389 【模板】高斯消元法

考虑求解如下方程组:

{x1+3x2+4x3=5x1+4x2+7x3=39x1+3x2+2x3=2

把系数写到矩阵里:

[134514739322]

把未知项的系数单独拿出来考虑:

[134147932]

如果能够将其化为:

[???0??00?]

就可以从最后一行逆推上去。设第一行第一列为主元,利用加减消元法配系数消掉后两行的第一列:

[13401302434]

再以第二行第二列为主元,加减消元得到:

[1340130038]

即得目标状态,实现时把 b 的那一列一起带入消元即可。

每次选取系数最大的为主元可以有效降低精度误差。

本质就是用初等变换消为一个下三角矩阵。

约旦消元法

其能避免回带来求出答案,也就是要把矩阵变为:

[?00?0?0?00??]

首先,我们依照朴素的高斯消元不难得到:

[????0???00??]

观察上下两个矩阵,不难得到消元时同时消去主元上下方的方程即可。

注意一下特殊情况:

  • 无解:当左边系数为 0 而右边系数不为 0 时即为无解。

  • 多解:当左边系数为 0 而右边系数也为 0 时即为多解。

解异或方程组

异或方程组是指形如

{a1,1x1a2,2x2a1,nxn=b1a2,1x1a2,2x2a2,nxn=b2an,1x1an,2x2an,nxn=bn

的方程组,其中 ai,j,bi{0,1}

由于 符合交换律与结合律,故可以按照高斯消元法逐步消元求解。值得注意的是,在消元的时候应使用异或消元而非加减消元,且不需要进行乘除改变系数(因为系数均为 01 )。

可以用 bitset 优化到 O(n3ω)

P3429 [POI 2005] DWA-Two Parties

给出一张无向图,需要给每个点染上黑色或白色。定义一个点合法当且仅当其所有同色邻居数量为偶数,最大化合法点的数量,并构造方案。

n200mn(n1)2

可以证明答案始终为 n 。构造就是求解如下异或方程组:

(u,v)G(xuxv)=degumod2

这个方程始终有解,否则若出现能将其消为左边没有元而右边为 1 的情况,其说明存在奇数个奇度数的点。而每个奇度数的点要选奇数个邻居在集合中,偶度数点要选偶数个邻居在集合中,从而其导出子图的度数为奇数,矛盾。

矩阵求逆

P4783 【模板】矩阵求逆

对于矩阵 A ,若存在矩阵 A1 使得 A×A1=A1×A=I ,则称矩阵 A 可逆,A1 为其逆矩阵。

给出 n 阶方阵 A ,求解其逆矩阵的方法如下:

  • 构造一个 n×2n 的矩阵 (A,In)
  • 用高斯消元法将其化简为最简形 (In,A1) ,即可得到 A 的逆矩阵 A1
  • 如果最终最简形的左半部分不是单位矩阵 In ,则矩阵 A 不可逆。

行列式求值

P7112 【模板】行列式求值

考虑一个情况,当一个矩阵任意一个位置出现 0 ,其对行列式的影响非常大(直接没有贡献了)。

我们利用上面的一些性质显然是可以让矩阵不断变化出现 0 的。考虑将矩阵一行(列)消成只有最后一个元素非 0 该怎么做。也就是说:

[a1,1a1,2a1,na2,1a2,2a2,nan,1an,2an,n][a1,1a1,2a1,na2,1a2,2a2,n00an,n]

对于 1n1 列中的第 i 列,我们只要让第 i 列整列加上第 n 列的 an,ian,n 倍即可在 detA 不变的情况下消掉点 n1 个元素

运用行列式展开发现 detA=an,n×An,n

去掉 an,n 所在的行和列,继续消元,则发现 detA=an1,n1×An1,n1

以此类推,如果我们一直对当前行列式消元,取最末(右下角)位的指和其余子式,余子式作为新行列式重新做。

一直递归下去做,我们发现最后我们得到一个下三角行列式。

我们就会发现这样一个矩阵的行列式是其对角线所有元素的乘积,即 i=1nai,i

band-matrix

长这个样子:

空白部分都为 0 ,橙色部分可以为任何数,这样中间就形成了一个宽度大约为 d 的带。

可以发现任意一个 i 满足从 (i,i) 向右或向下拓展都有不超过 d1 个非零数字,即很多位置根本不需要消。

具体地,假设现在要消第 i 列,那么从第 i 行开始往下枚举 d1 行,每行往右消 d 个数字即可,最后仍能得到一个上三角矩阵。

与普通高斯消元有点不一样的地方在于当主元为 0 的时候的处理方法。在 band-matrix 中,若直接交换行会破坏 band-matrix 。注意到每次交换完后交换的行右边最多多出 d 个数,于是每次往右消元 2d 个数即可。

时间复杂度 O(nd2)

还有一种解决主元为 0 的方法,普通高消是交换行,这里只要交换列就可以保持 band-matrix 的性质了,时间复杂度也是 O(nd2)

CF24D Broken robot

nm 列的矩阵,现在在 (x,y),每次等概率向左、右、下走或原地不动,但不能走出去,求走到最后一行期望的步数。

n,m103

fi,j 表示机器人在 (i,j) 时走到最后一行的期望步数,则:

m=1 时有(省略第二维):

fi=1+12(fi+1+fi)

即:

fi=fi+1+2

m>1 时有:

fi,j=1+{13(fi,j+fi+1,j+fi,j+1),j=114(fi,j+fi+1,j+fi,j1+fi,j+1),1<j<m13(fi,j+fi+1,j+fi,j1),j=m

注意到这是一个 d=2 的 band-matrix ,直接使用 band-matrix 消元即可,时间复杂度 O(nmd2)

CF963E Circles of Waiting

平面直角坐标系上有一个点,一开始在 (0,0) ,每秒钟这个点都会随机移动,如果它在 (x,y) ,下一秒:

  • (x1,y) 的概率是 p1
  • (x,y1) 的概率是 p2
  • (x+1,y) 的概率是 p3
  • (x,y+1) 的概率是 p4

保证 p1+p2+p3+p4=1 ,求该点移动至距离原点距离为大于 R 的点的期望步数

0R50

把所有满足 i2+j2R2 的点依次编号,显然有 O(R2) 个点。

fid(i,j) 表示 (i,j) 走出圆的期望步数,(i,j) 只要转移到 (i,j1),(i1,j),(i,j+1),(i+1,j) 。因为是依次编号,所以建出来的矩阵带宽 2R+1 。套用 band-matrix ,可以做到 O(R2d2)=O(R4)

P4457 [BJOI2018] 治疗之雨

你有 p 滴血量,血量上限为 n 。每轮操作如下:

  • 先以 1m+1 的概率增加 1 滴血,满血时则概率为 0
  • k 次判定,每次以 1m+1 的概率减少一滴血,死了则概率为 0

求期望几轮死亡。

n1500m,k109

fi 表示血量为 i 时期望多少轮结束,则:

fi=1+j=0min(i,k)(mm+1fij+1m+1fij+1)×(kj)(1m+1)j(mm+1)kj

注意一下 i=n 时的情况即可。

观察到 fi 只与 f0i+1 有关,所以矩阵应该是一个类似下三角矩阵的东西。因为我们高斯消元的时候是拿自己这行去减下面的,所以每一行中只有 2 个系数要去和下面的相减,时间复杂度就可以做到 O(n2) 了。

P6899 [ICPC2014 WF] Pachinko

有一个宽度为 w 高度为 h 的方格纸, w×h 的格子中,有一些是空的,有一些是洞,有一些是障碍物。从第一行的空的格子中随机选一个放置一个球,向上下左右移动的概率比为 pu:pd:pl:pr ,不能移动到有障碍物的格子上。对于每个洞,输出落入该洞的概率。

220,h104,pu+pd+pl+pr=100

和上面比较类似。

树上高消

若在树上进行高斯消元,往往一个叶子和其父亲的值呈一次函数关系。

那么类似数学归纳法地向上递推,可以发现所有点的值和根的值都是一次函数关系。

此时会发现所有值之和为定值,或者某些点(如根、叶子)的值容易求,那么就可以递推优化到 O(n)

P5643 [PKUWC2018] 随机游走

给定一棵有根树,q 次询问从根走到 S 中的所有点至少一次的期望步数。

n18q5000

求经过 S 里所有元素的期望时间,即到达 S 中最后一个点的期望步数( max ),那么可以转化为枚举 S 的子集 T ,求到达 T 中第一个元素的期望时间( min )。

考虑 Min-Max 容斥,设 fu,S 表示 u 第一次走到 S 中的点的期望步数,du 表示 u 的度数,则:

fu,S=ffau,S+vson(u)fv,Sdu+1(xS)fu,S=0(xS)

考虑将每个点的值都写作 fu,S=ku×ffau,S+bu 的形式,记:

Ku=vson(u)kv,Bu=vson(u)bv

则得到:

fu,S=1duKu×ffau,S+du+BuduKu

即:

ku=1duKu,bu=du+BuduKu

答案即为 TS(1)|T|+1fr,T ,不难用高维前缀和预处理后 O(1) 查询。时间复杂度 O(n2n+q)

P11736 [集训队互测 2015] 胡策的小树

有一棵树,点权 a1n 构成了一个 0n1 的排列,并且满足 a1=0

初始时,每个节点各有一只猴子,每一秒第 i 个点上的猴子会有 p(i) 的概率跳到父亲,1p(i)sizi 的概率跳到子树内的任意点,其中 p(i)={0i=1ain2in

初始时将所有点的权值变为 (ai+x)modn ,其中 x 为自行选定任意非负整数。

记第 i 秒成功跳到父亲的猴子数量为 gi ,幸福指数被定义为 g0+ 的平均数。选取适当的 x ,求幸福指数期望的最大值。

n5×105 ,节点 i 的父亲从 1i1 中等概率选取

先考虑初始操作 x=0 的情况。可以发现每只猴子对答案的贡献是独立的,进一步发现每只猴子的初始位置是不重要的。因为时间无穷,因此一只猴子一定会跳到根,并可以忽略跳到根之前的贡献。下面讨论从根开始跳的答案。

pi=p(i),qi=1pisizi ,设猴子处于 u 的概率为 fu ,则:

fu=(wanc(u){u}qwfw)+(vson(u)pvfv)fu=1

暴力高消可以做到 O(n3) ,但是没有利用树上高消的性质。

枚举祖先并不好树上高消,记 Fu=wanc(u)qwfw ,则 fu=1qu(FuFfau) ,带入得到:

1qu(FuFfau)=Fu+vson(u)pvqv(FvFu)(1qu1+vson(u)pvqv)Fu=1quFfau+vson(u)pvqvFv

记:

(1)Au=1qu1+vson(u)pvqv(2)Bu=1qu(3)Cu=puqu

则:

AuFu=BuFfau+vson(u)CvFv

考虑设 Fu=kuFfau+bu ,则:

(4)Au(kuFfau+bu)=BuFfau+vson(u)Cv(kvFu+bv)(5)(Auvson(u)Cvkv)Fu=BuFfau+vson(u)Cvbv

于是可以 O(n) 高消求解 x=0 时幸福指数的期望 pifi

考虑 x0 的情况,此时一定存在一个点 i 满足 p(i)=0 ,也就是说跳到 i 子树内后就跳不出来了。于是对于每个点的子树做一遍树上高消即可。

时间复杂度 O(sizi) ,因为树的形态随机,因此时间复杂度 O(nlogn)

posted @   wshcl  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示