洛谷 P3389 【模板】高斯消元法 × 洛谷 P2455 [SDOI2006]线性方程组

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

一、传送门

https://www.luogu.com.cn/problem/P3389
https://www.luogu.com.cn/problem/P2455

二、代码

日……两道题合起来搞了我十几个小时,最后把我气得从别人的 AC 代码开始再一句一句改成适配自己模板的同义的语句。
有些细节还是不太懂,暂时先把模板放上来。以后有时间再出详解。
————————————————————————————————————————————————————
高斯消元函数 gauss_elim() 的返回值:
0,唯一解;1,格式错(矩阵不是n行×(n+1)列);2,无数解;3,无解。
————————————————————————————————————————————————————
P3389:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdint>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
template<class _Ty = double> class matrix {
private:
	vector<vector<_Ty>> m; size_t row, col, _size;
public:
	matrix() { row = col = _size = 0; }
	matrix(const size_t& r, const size_t& c) { init(r, c); }
	virtual ~matrix() { del(); }
	void clear() { fill(m[0], m[0] + _size, 0); }
	void del() { m.resize(0); }
	void init(const size_t& r, const size_t& c) {
		row = r; col = c; _size = row * col; m.resize(r); for (size_t i = 0; i != r; ++i)m[i].resize(c);
	}
	void resize(const size_t& r, const size_t& c) const { del(); init(r, c); }
	void resize_directly(const size_t& r, const size_t& c) { row = r; col = c; _size = row * col; }
	size_t _row() const { return row; }
	size_t _col() const { return col; }
	size_t size() const { return _size; }
	void row_mul(const size_t& row, const _Ty& val) {
		for (size_t i = 0; i != col; ++i)m[row][i] *= val;
	}
	void row_mul_add_to(const size_t& rs, const _Ty& val, const size_t& rd) {
		for (size_t i = 0; i != col; ++i)m[rd][i] += m[rs][i] * val;
	}
	void interchange(const size_t& r1, const size_t& r2) { swap(m[r1], m[r2]); }
	vector<_Ty>& operator[](const size_t& r) { return m.at(r); }
	const vector<_Ty>& operator[](const size_t& r) const { return m.at(r); }
};
template<class _Ty = double> inline unsigned gauss_elim(matrix<_Ty>& a, _Ty* const x) {
	_Ty y, b; size_t n = a._row(), p, c; bool inf = false;
	for (size_t i = 0; i < n; ++i) {
		p = i; b = abs(a[p][i]);
		for (size_t j = i + 1; j < n; ++j)if (abs(a[j][i]) > b) { p = j; }
		if (p != i)a.interchange(p, i);
		if (a[i][i] == 0)continue;
		b = 1 / a[i][i];
		for (size_t j = 0; j < i; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);
		for (size_t j = i + 1; j < n; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);
	}
	for (size_t i = 0; i < n; ++i) {
		c = 0;
		for (size_t j = 0; j <= n; ++j) { if (a[i][j] == 0)++c; }
		if (c == n && a[i][n]) { return 3; }
		if (c == a._col()) { inf = true; }
	}
	if (inf)return 2;
	for (size_t i = n - 1; i != SIZE_MAX; --i) {
		y = a[i][n]; for (size_t j = n - 1; j > i; --j) { y -= a[i][j] * x[j]; }
		x[i] = y / a[i][i];
	}
	return 0;
}
matrix<double> m; size_t n; double x[100];
int main() {
	scanf("%llu", &n); m.init(n, n + 1);
	for (size_t i = 0; i < n; ++i)
		for (size_t j = 0; j <= n; ++j)scanf("%lf", &m[i][j]);
	if (!gauss_elim(m, x))for (size_t i = 0; i < n; ++i)printf("%.2lf\n", x[i]);
	else puts("No Solution");
	return 0;
}

P2455:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdint>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
template<class _Ty = double> class matrix {
private:
	vector<vector<_Ty>> m; size_t row, col, _size;
public:
	matrix() { row = col = _size = 0; }
	matrix(const size_t& r, const size_t& c) { init(r, c); }
	virtual ~matrix() { del(); }
	void clear() { fill(m[0], m[0] + _size, 0); }
	void del() { m.resize(0); }
	void init(const size_t& r, const size_t& c) {
		row = r; col = c; _size = row * col; m.resize(r); for (size_t i = 0; i != r; ++i)m[i].resize(c);
	}
	void resize(const size_t& r, const size_t& c) const { del(); init(r, c); }
	void resize_directly(const size_t& r, const size_t& c) { row = r; col = c; _size = row * col; }
	size_t _row() const { return row; }
	size_t _col() const { return col; }
	size_t size() const { return _size; }
	void row_mul(const size_t& row, const _Ty& val) { for (size_t i = 0; i != col; ++i)m[row][i] *= val; }
	void row_mul_add_to(const size_t& rs, const _Ty& val, const size_t& rd) {
		for (size_t i = 0; i != col; ++i)m[rd][i] += m[rs][i] * val;
	}
	void interchange(const size_t& r1, const size_t& r2) { swap(m[r1], m[r2]); }
	vector<_Ty>& operator[](const size_t& r) { return m.at(r); }
	const vector<_Ty>& operator[](const size_t& r) const { return m.at(r); }
};
template<class _Ty = double> inline unsigned gauss_elim(matrix<_Ty>& a, _Ty* const x) {
	_Ty y, b; size_t n = a._row(), p, c; bool inf = false;
    for (size_t i = 0; i < n; ++i) {
		p = i; b = abs(a[p][i]);
		for (size_t j = i + 1; j < n; ++j)if (abs(a[j][i]) > b) { p = j; }
		if (p != i)a.interchange(p, i);
		if (a[i][i] == 0)continue;
		b = 1 / a[i][i];
        for (size_t j = 0; j < i; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);
        for (size_t j = i + 1; j < n; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);
    }
    for (size_t i = 0; i < n; ++i) {
        c = 0;
        for (size_t j = 0; j <= n; ++j) { if (a[i][j] == 0)++c; }
		if (c == n && a[i][n]) { return 3; }
		if (c == a._col()) { inf = true; }
    }
    if (inf)return 2;
	for (size_t i = n - 1; i != SIZE_MAX; --i) {
		y = a[i][n]; for (size_t j = n - 1; j > i; --j) { y -= a[i][j] * x[j]; }
		x[i] = y / a[i][i];
	}
	return 0;
}
matrix<double> m; size_t n; double x[50];
int main() {
	scanf("%llu", &n); m.init(n, n + 1);
	for (size_t i = 0; i < n; ++i)
		for (size_t j = 0; j <= n; ++j)scanf("%lf", &m[i][j]);
	switch (gauss_elim(m, x)) {
	case 3:puts("-1"); return 0;
	case 2:puts("0"); return 0;
	default:for (size_t i = 0; i < n; ++i)printf("x%llu=%.2lf\n", i + 1, x[i]); return 0;
	}
}
采用GAUSS列主消元法求解线性方程组(MATLAB) 程序清单: %%求解任意线性方程组的解 clc; clear all; format long e disp('线性方程组求解,请输入参数'); n=input('维数n='); A=input('矩阵A='); b=input('右端项b='); eps=input('控制精度eps='); b=b';   %%变为列向量 A=[A b];    %%矩阵增广 阅读详情

相关推荐

gauss_elim(A,O):高斯消元法-matlab开发

此代码用于使用高斯消元法查找系数,但是此代码特定于 3x3 矩阵,您可以根据需要更改它

中国源码网站大全 以及ALEXA排名

网址                   ALEXA排名www.chinaz.com  141www.cncode.com 20,083www.downcode.com 8367www.my503.com  57,646 www.cncodez.com 755,718 www.2okok.com 8,196www.jianjie8.com  64,320www.zg010.com 245,098w...

weixin_34122548的博客 1万+

城市空气质量时空预测与污染源贡献度分析.zip

大气污染是影响公众健康与生态环境的重要问题,精准的空气质量时空预测与污染源贡献度量化是精准治污的关键支撑。针对现有研究多源融合不充分、时空关联刻画不足、预测与源解析割裂三方面缺陷,本文设计实现了城市空气质量时空预测与污染源贡献度分析系统,融合监测、气象、工业排放与交通四类数据,构建基于时空注意力的LSTM(STAM-LSTM)预测模型与基于正定矩阵因子分解(PMF)的源解析模型,形成数据融合-特征工程-预测-源解析-可视化闭环。 系统实现四类数据时空对齐与融合,构建时序与空间邻域特征,以普通克里金插值生成1km网格浓度场;STAM-LSTM引入时空注意力自适应学习站点间污染传输时变权重,以72小时输入预测未来24小时逐小时PM2.5浓度;PMF识别交通、工业、燃煤、扬尘与二次生成五个源因子,量化各源全年贡献度并分析时空演变。 实验表明:STAM-LSTM预测RMSE 24.6、MAE 17.8、R² 0.88,相对LSTM基线(30.2)提升18.5%;普通克里金插值误差8.9,优于反距离加权(11.4);源解析显示交通源28.4%、工业源23.1%、燃煤源19.6%为主要贡献源,冬季燃煤源升至27.3%、早高峰交通源达34.8%,下风向工业源贡献高出上风向8~12个百分点;减排情景显示交通源减排20%可使年均PM2.5下降5.7%,与源贡献度排序一致。 系统按五模块14组件实现,功能测试16项用例全部通过,为大气污染预警、源管控与减排政策制定提供了决策依据。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论 第3章 系统需求分析 第4章 系统总体设计 第5章 系统详细设计与实现 第6章 系统测试与分析 第7章 总结与展望 参考文献 附件-实现指南

在linux服务器上装svn版本管理,自动部署代码到项目

在linux服务器上装svn版本管理,自动部署代码到项目 http://bbs.aliyun.com/read/9715.html?spm=5176.7114037.1996646101.1.W3zw3X&pos=1 http://v5sheji.com/archives/setupsvnonlinux.html 1.安装svn服务器端 yum instal...

anlei2455的博客 256

poj 2455 Secret Milking Machine

(http://www.elijahqi.win/2017/12/25/poj2455-secret-milking-machine/) Description Farmer John is constructing a new milking machine and wishes to keep it secret as long as possible. He has hidden in i

Elijahqi 300

高斯消元法的MATLAB代码

高斯消元法的原理详见于线性代数课本,其MATLAB代码如下: function[x]=gauss_elim(A,b) % A为系数矩阵且必须为方阵 % b为常数项向量 n=size(A,1); x=zeros(1,n); j=0; for i=1:n-1 if(A(i,j)==0) t=min(find(A(i+1:n,1)~=0+i); if(i...

时有限 2万+

高斯消元法

在数学模块,我们将学习矩阵相关知识,主要是矩阵乘法、高斯消元、线性空间。高斯消元也可以与其他知识点结合起来,比如dp。坏掉的机器人这道题目就是dp套高斯消元。 高斯消元的思路参考进阶指南。主要目的是将矩阵通过初等行变换最后转化为简化阶梯型矩阵。系数和常数构成n∗(n+1)n*(n+1)n∗(n+1)的增广矩阵。有三种特殊情况: 最后有n个主元。那么解唯一。 有k个主元,自由元n-k。解无限多。 存在0=d0=d0=d这种形式。无解。 下面举四个例题。 洛谷: P3389模板高斯消元法 #inclu

zhendong 945

【高斯消元】学习笔记

讲解高斯约旦消元的原理和无解,无穷数解的分析。以及异或消元

lrz_br的博客 1338

20191026 专题:高斯消元

总览: 两种方法:回代和约旦。(约旦不知道比回代高到哪里去了) 思路都是加减消元。 注意无解和无穷解。 只要列出方程就是模板…(可是方程列不出) (:逃 神仙博客:传送门 T1 P3389模板高斯消元法 (https://www.luogu.org/problem/P3389) 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入格式 第一行,一个正整数 nnn 第二至n+...

hongkongreporter 192

高斯消元学习笔记

高斯消元 其实没有你想象的这么难,你解方程的时候也会用到它。。。就是加减消元罢了 没有前置芝士,直接开始看吧 实现过程 首先我们对于方程的性质就不说了吧 我们设这方程组为 矩阵的初等行变换 我们把上述方程组转换为矩阵的形式: 共有n行,每行有n+1项。 矩阵的初等行变换有以下几种: (1) 交换矩阵的两行 (2) 以一个非零数k乘矩阵的某一行所有元素 (3) 把矩阵的某一行所有元素...

weixin_30583563的博客 182

高斯消元——学习笔记

相信大家从小学起就学会了如何解多元一次方程,知道n个n元一次方程是可解的。但随着方程元数的升高,人力已经无法解决这一问题,于是我们需要借助计算机。而计算机解决这一问题的方法,其一就是高斯消元。 假设我们现在需要求解一个n元一次方程: ⎧⎩⎨⎪⎪⎪⎪&nbsp;a11∗x1+a12∗x2+⋯+a1n∗xn=b1&nbsp;a21∗x1+a22∗x2+⋯+a2n∗xn=b2&nbsp;⋯&nbsp...

CleverLarry的博客 329

高斯消元法 & 高斯-约当 (Gauss-Jordan) 消元法

高斯消元法 & 高斯-约当 (Gauss-Jordan) 消元法   2010-05-24 18:02:10|  分类:控制理论 |  标签:|字号大中小 订阅 高斯消元法是求解线性方程组的常用方法,高斯约当消元法大家可能不是很熟悉。下面先介绍线性方程组和矩阵的一些基本概念与高斯消元法,然后着重介绍高斯约当消元法相对于高斯消元法的优势:程序简单(不需要回代),应用广泛(例

1万+

洛谷P2455 [SDOI2006]线性方程组

题目描述已知n元线性一次方程组。其中:n&lt;=50, 系数是[b][color=red]整数&lt;=100(有负数),bi的值都是整数且&lt;300(有负数)(特别感谢U14968 mmqqdd提出题目描述的说明)(redbag:是mqd自己要我写的= =)[/color][/b].编程任务:根据输入的数据,编程输出方程组的解的情况。输入输出格式输入格式:第一行:未知数的个数。以下n行n+...

蒟蒻的博客 707

洛谷 P2455 [SDOI2006]线性方程组(高斯消元)

传送门 题目描述 已知n元线性一次方程组。 其中:n<=50, 系数是整数<=100(有负数),bi的值都是整数且<300(有负数)(特别感谢U14968 mmqqdd提出题目描述的说明)(redbag:是mqd自己要我写的= =). 编程任务: 根据输入的数据,编程输出方程组的解的情况。 输入格式 第一行:未知数的个数。以下n行n+1列:分别表示每一格方程的系数及方程右边的值...

Onebelieve_lxl的博客 379

基于iTransformer-BiGRU-KAN多模型融合的滚动轴承剩余寿命预测研究(Python代码实现)

基于iTransformer-BiGRU-KAN多模型融合的滚动轴承剩余寿命预测研究(Python代码实现)内容概要:本文提出了一种基于iTransformer-BiGRU-KAN多模型融合的滚动轴承剩余寿命预测方法,旨在通过结合多种先进深度学习模型的优势,提升在复杂工况下的预测精度与鲁棒性。该方法利用iTransformer捕捉长期时间序列中的全局依赖关系,通过BiGRU模型提取双向时序特征,最后引入KAN(Kernel Attention Network)增强非线性映射与关键特征的自适应加权能力,实现对轴承退化过程的精准建模。文中详细介绍了模型架构设计、训练流程及在公开数据集上的实验验证,结果表明该融合模型相比单一模型在预测精度和稳定性方面均有显著提升。; 适合人群:具备一定机器学习与深度学习基础,从事设备故障诊断、工业大数据分析或智能运维相关领域的研究人员及工程技术人员,尤其适合研究生及以上学历或有相关项目经验的专业人员。; 使用场景及目标:①应用于工业设备状态监测与预测性维护系统中,实现对滚动轴承等关键部件剩余寿命的精准预测;②为复杂时间序列回归任务提供多模型融合的设计思路与技术参考;③推动深度学习在智能制造与工业物联网领域的落地应用。; 阅读建议:建议读者结合Python代码实现部分,深入理解各子模型的接口设计与融合逻辑,重点关注特征融合机制与注意力权重的可视化分析,以便在实际项目中灵活调整与优化模型结构。

中文版本的几何画板 几何必备

有时候写代码遇到了数学问题可以通过这个分析。

python4.14版本的环境下载器

可以快速的通过python下载器来下载python3.14版本。

上一篇: UOJ #332. 【NOIP2017】奶酪(暴力)
下一篇: 【代码超详解】POJ 1265 Area(简单计算几何 · Pick 定理)
山上一缕烟
博客等级 码龄7年 269粉丝 498原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值