一次线性方程组 高斯消元笔记
1.莫比乌斯反演笔记2.欧拉定理 & 扩展欧拉定理 笔记3.高级数据结构笔记4.多项式(Poly)笔记5.扩展中国剩余定理(Excrt)笔记
6.一次线性方程组 高斯消元笔记
7.群论笔记8.字符串学习笔记9.一些典型的计数10.图论笔记11.高等代数笔记12.[笔记]博弈论 & SG 函数13.[笔记]决策单调性14.[笔记]线性基15.[笔记]组合数学的符号化方法16.[笔记]后缀自动机笔记17.[笔记]生成函数及其展开技巧18.[笔记]min25 筛19.[笔记]各种模板20.[笔记]插值21.[笔记]杜教筛 & Powerful Number 筛22.[笔记]动态规划优化(斜率优化,决策单调性优化)23.[笔记]行列式24.[笔记]Stern-Brocot 树25.[笔记]Important Tricks And Lemmas高斯消元原理
高斯消元用来解如下形式的方程组:
首先将所有系数写成系数矩阵:
接下来可以进行初等行列变换,将矩阵消成下三角矩阵。类似这样:
然后最后一行就表示 ,可以解出 。
然后往回带,解出 ,以此类推即可。时间复杂度 。
void gauss() {
rep(i, 1, n) {
rep(j, i, n) if (fabs(a[j][i]) > eps) {
swap(a[j], a[i]); break;
} if (fabs(a[i][i]) <= eps) continue;
rep(j, i + 1, n) {
if (fabs(a[j][i]) <= eps) continue;
db inv = (db)a[j][i] / a[i][i];
rep(k, i, n + 1)
a[j][k] -= inv * a[i][k];
}
}
for (int i = n; i; i -- ) {
f[i] = a[i][n + 1] / a[i][i];
for (int j = i - 1; j; j -- )
a[j][n + 1] -= a[j][i] * f[i];
}
}
高斯消元应用
- 解线性方程组
这个不用我说了吧。。。
- 在 中用于消元
这个用处非常大。举个栗子:P3232 [HNOI2013] 游走
题意:给定 点 边无向简单图。要求给每条边重新编号 ,使得每条边编号不同且从 到 经过路径的权值和期望尽可能小。
。
发现边数很多,所以从点数入手。设 表示第 个点被经过的期望次数,那么有:
当然, 号点被我们排除在外,因为到了 就停止了。
然后发现,上面的柿子形成了一个 元方程。用高斯消元解方程就可以得到 。
然后可以得到每条边被经过的期望次数:。根据边被经过的期望次数贪心赋权即可。
其他用高斯消元求解 的例题:P4321 随机漫游
- 矩阵求逆
矩阵 的逆矩阵定义为 ,满足 且 。其中 表示单位矩阵。
求法:将原矩阵 右面拼上一个单位矩阵 。然后对左边一半也就是 做初等行列变换消成单位矩阵,同时对右边做左边同样的操作(左边行加右边也加,左边同乘右边也同乘)。最后得到的右半边就是 。
证明真的不会/kk
int gauss() {
rep(i, 1, n) {
rep(j, i, n)
if (a[j][i] != 0) {
swap(a[i], a[j]); break;
}
if (a[i][i] == 0) return 0;
rep(j, i + 1, n) {
if (a[j][i] == 0) continue;
int inv = a[j][i] * qpow(a[i][i]) % mod;
rep(k, i, 2 * n) a[j][k] -= inv * a[i][k] % mod,
a[j][k] = (a[j][k] % mod + mod) % mod;
}
}
rep(i, 1, n) {
int inv = qpow(a[i][i]);
rep(j, 1, 2 * n) a[i][j] = a[i][j] * inv % mod;
}
dep(i, n, 1) {
rep(j, 1, i - 1) {
int inv = a[j][i];
rep(k, 1, 2 * n) a[j][k] -= a[i][k] * inv % mod,
a[j][k] = (a[j][k] % mod + mod) % mod;
}
} return 1;
}
signed main() {
read(n); int B = (10 * n + 5) * sizeof(LL);
rep(i, 0, n + 1) a[i] = (LL*)malloc(B);
rep(i, 1, n) rep(j, 1, n) read(a[i][j]);
rep(i, 1, n) a[i][i + n] = 1; int s = gauss();
if (!s) return puts("No Solution"), 0;
for (int i = 1; i <= n; i ++ , pc('\n'))
rep(j, 1, n) write(' ', a[i][j + n]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示