Gauss 消元法

错乱瞎写

1. 线性方程组

省流:初等行变换化为一个上三角,然后瞬间出解

inline bool z(const double& x){return abs(x)<eps;}
int Gauss() // O(n^3)
{
	int c, r;
	for (c=1, r=1; c<=n; c++)
	{
		int m = r;
		for (int i=r; i<=n; i++)
			if (abs(a[i][c]) > abs(a[m][c])) m = i;
		if (z(a[m][c])) continue;
		for (int i=c; i<=n+1; i++) swap(a[m][i],a[r][i]);
		for (int i=n+1; i>=c; i--) a[r][i] /= a[r][c];
		for (int i=r+1; i<=n; i++)
			if (!z(a[i][c]))
				for (int j=n+1; j>=c; j--) a[i][j] -= a[r][j] * a[i][c];
		r++;
	}
	for (int i=n; i>=0; i--) //回代
		for (int j=i+1; j<=n; j++) a[i][n+1] -= a[i][j] * a[j][n+1];
	if (r <= n)
	{
		for (int i=r; i<=n; i++)
			if (!z(a[i][n+1])) return -1;
		return 0;
	} return 1;
}

2. 球形空间产生器sphere

\((r_1,r_2,\cdots,r_n)\)

\[\forall i:\sum (r_i-x_{k,i})^2=R \]

\[\forall i:\sum r_i^2-2\sum r_ix_{k,i}+\sum x_{k,i}^2=R \]

\[\forall i:2\sum r_ix_{k,i}=\sum x_{k,i}^2-c \]

\[\sum 2(x_{p,i}-x_{q,i})r_i = \sum (x_{p,i}^2-x_{q,i}^2) \]

3. 臭气弹

两种思路:

第一种:暴算

设一个到达 \(u\) 点的概率 \(dp_u\),由于全概率公式

\[\boxed{\mathbb P(A) = \sum \mathbb P(B_i)\mathbb P(A|B_i)} \]

所以

\[dp_u=\sum_{v\to u}\dfrac{1-P/Q}{\deg v}\cdot dp_v \]

Gauss 消元解出来即可 .

特别的,点 \(1\) 还可以从天而降(概率为 \(1\)),所以 \(dp_1\gets dp_1+1\) .

于是答案是 \(\dfrac QP dp_u\) 或者下面那个带 \(\sum\) 的做法 = =

第二种:期望

\(dp_u\) 表示到达 \(u\) 点的期望次数,这里可以拆点(炸 / 不炸)也可以直接搞

\(dp\) 随便求(高斯消元解 dp),然后每个点的概率就是

\[\mathbb P(u)=\dfrac{dp_u}{\sum dp_i} \]


eps 要开到 \(10^{-9}\),要不然精度不够)

4. 开关问题

也是两种思路:

第一种是列出一个同余 \(2\) 的线性方程组,然后发现初等行变换依然成立;
第二种是列出一个 xor 线性方程组,初等行变换全部改成 xor 消;

不管哪一种,最后找出自由元数量 \(r\)\(2^r\) 就是答案 .

原文地址:https://www.cnblogs.com/CDOI-24374/p/15688927.html