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

(r1,r2,,rn)

i:(rixk,i)2=R

i:ri22rixk,i+xk,i2=R

i:2rixk,i=xk,i2c

2(xp,ixq,i)ri=(xp,i2xq,i2)

3. 臭气弹

两种思路:

第一种:暴算

设一个到达 u 点的概率 dpu,由于全概率公式

P(A)=P(Bi)P(A|Bi)

所以

dpu=vu1P/Qdegvdpv

Gauss 消元解出来即可 .

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

于是答案是 QPdpu 或者下面那个带 的做法 = =

第二种:期望

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

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

P(u)=dpudpi


eps 要开到 109,要不然精度不够)

4. 开关问题

也是两种思路:

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

不管哪一种,最后找出自由元数量 r2r 就是答案 .

posted @   yspm  阅读(100)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示