P3389 【模板】高斯消元法
高斯消元求解n元一次线性方程组的板子题:

先举个栗子:
 
②+①* (2/3)
③+①

接着对①变换

得到x,y,z;
但是我们想到,如果它有在原方程中就有两个或多个方程本质上是一样的,那他不就解不出来了咩?
比如:

最后得出:

这显然就属于无解的情况
又比如:

这显然就属于无穷多解的情况
这里我们引入一个定理:
一个矩阵的行列式如果不为0,方程组有唯一解,否则无解或者无穷多解
然后我们就可以通过计算行列式来判断有无解辣!
高斯消元求解线性方程组的步骤:
Step1:利用高斯消元将原矩阵(蒟阵 变为对角矩阵
具体方法:将a[i][i]除成1,这一行也进行同样的变换,用这个1去消其他的项
在将原矩阵变为对角矩阵的过程中,线性方程组就已经消成了ax=b的形式,故只需要判断有无解即可;
求行列式:
先了解一下运算法则:传送门
行列式的计算:

举两个例子

测试代码如下(注意是这里输入n是未知数个数,m是方程个数,对于这个题mn输入一样的就可以辣!):
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
const double pi=acos(-);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof a)
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
ld eps=1e-;
ll pp=;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll read(){
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
//head
int n,m;
double a[][]; bool check(int k){
if(fabs(a[k][n+])<eps)return ;
rep(i,,n)
if(fabs(a[k][i])>eps)return ;
return ;
}
int main(){ n=read();m=read();
// a_i,1 a_i,2 ... a_i,n a_i,n+1
rep(i,,m)
rep(j,,n+)a[i][j]=read();
rep(j,,m){
rep(k,,n+)cout<<a[j][k]<<" ";
puts("");
}
int flag=;
rep(i,,n){
int t=i;
while(a[t][i]== && t<=n)t+=;
if(t==n+){
flag=;
continue;
}
rep(j,,n+)swap(a[i][j],a[t][j]);//交换两行
double kk=a[i][i];//每一行对角线上的值
rep(j,,n+)a[i][j]/=kk;
rep(j,,m)//循环m个式子 开始消元
if(i!=j){
double kk=a[j][i];
rep(k,,n+)
a[j][k]-=kk*a[i][k];//这样就能保证正好把第i列的数除了a[i][i] 都消成0
}
puts("------------");
rep(j,,m){
rep(k,,n+)cout<<a[j][k]<<" ";
puts("");
}
}
if(flag){//如果flag=1,可能是 无解,也可能是无穷解
rep(i,,m)
if(!check(i)){
printf("No solution\n");
return ;
}
printf("So many solutions\n");
} }
本题AC代码:稍微改一下就行啦
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pr;
const double pi=acos(-);
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define Rep(i,u) for(int i=head[u];i;i=Next[i])
#define clr(a) memset(a,0,sizeof a)
#define pb push_back
#define mp make_pair
#define fi first
#define sc second
ld eps=1e-;
ll pp=;
ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
ll read(){
ll ans=;
char last=' ',ch=getchar();
while(ch<'' || ch>'')last=ch,ch=getchar();
while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
if(last=='-')ans=-ans;
return ans;
}
//head
int n,m;
double a[][]; bool check(int k){
if(fabs(a[k][n+])<eps)return ;
rep(i,,n)
if(fabs(a[k][i])>eps)return ;
return ;
}
int main(){ n=read();m=n;
// a_i,1 a_i,2 ... a_i,n a_i,n+1
rep(i,,m)
rep(j,,n+)a[i][j]=read(); int flag=;
rep(i,,n){
int t=i;
while(a[t][i]== && t<=n)t+=;
if(t==n+){
flag=;
continue;
}
rep(j,,n+)swap(a[i][j],a[t][j]);//交换两行
double kk=a[i][i];//每一行对角线上的值
rep(j,,n+)a[i][j]/=kk;
rep(j,,m)//循环m个式子 开始消元
if(i!=j){
double kk=a[j][i];
rep(k,,n+)
a[j][k]-=kk*a[i][k];//这样就能保证正好把第i列的数除了a[i][i] 都消成0
}
}
if(flag){ return printf("No Solution\n"),;
}
rep(j,,m){
printf("%.2lf",a[j][n+]/a[j][j]);
puts("");
} }
P3389 【模板】高斯消元法的更多相关文章
- 洛谷P3389 【模板】高斯消元法
		P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1,a ... 
- 题解 P3389 【【模板】高斯消元法】
		题解 P3389 [[模板]高斯消元法] 看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下 我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地) 一句话解释高斯约旦消元法: 通过加减 ... 
- 洛谷——P3389 【模板】高斯消元法
		P3389 [模板]高斯消元法 以下内容都可省略,直接转大佬博客%%% 高斯消元总结 只会背板子的蒟蒻,高斯消元是什么,不知道诶,看到大佬们都会了这个水题,蒟蒻只好也来切一切 高斯消元最大用途就是解多 ... 
- 洛谷P3389 【模板】高斯消元法(+判断是否唯一解)
		https://www.luogu.org/problemnew/show/P3389 这里主要说说怎么判断不存在唯一解 我们把每一行的第一个非零元称为关键元 枚举到一个变量,如果剩下的行中该变量的系 ... 
- 【洛谷P3389 【模板】高斯消元法】
		这是个版子题,当然本蒟蒻也是看了好几天才明白 对于这样的线性方程组,我们可以看成是一个矩阵 对于百度百科给的定义(我感到很迷)赶脚和行列式有的一拼 但我们要注意的是: 行列式是一个确切的值(有关行列式 ... 
- 【luogu P3389 高斯消元法】 模板
		题目链接: gauss消元求线性方程组的解. 这道题对于多解和无解都输出No solution #include <algorithm> #include <cstdio> # ... 
- 洛谷 P3389 【模板】高斯消元法
		以下这个好像叫高斯约旦消元法,没有回代 https://www.luogu.org/blog/37781/solution-p3389 #include<cstdio> #include& ... 
- 【洛谷P3389】(模板)高斯消元
		对于高斯消元法求解线性方程组, 我的理解就类似于我们在做数学题时的加减消元法, 只是把它写成一个通用的程序运算过程 对于一个线性方程组,我们从左往右每次将一列对应的行以下的元通过加减消元消去, 每个元 ... 
- 「LuoguP3389」【模板】高斯消元法
		题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 nn 第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdot ... 
随机推荐
- Messenger在MVVM模式中的应用
			Messenger在MVVM模式中的应用 Messenger在MVVM中应用的前提 我们知道在MVVM架构中,系统平台的Silverlight客户端界面开发和业务逻辑已经被分开,XAML是SL的主要部 ... 
- Android 反射获取一个方法(方法的参数不一样)
			private Method forget; private Method connect_netID; private Method connect_wifiConfig; private Meth ... 
- 在angular 6中使用 less
			在angular 6中使用 less 新项目 ng new [appname] --style less 已有的项目 修改 *.css 文件及引用处后缀名为 less并在 angular.json 文 ... 
- (四)版本控制管理器之VSS
			在上一篇<(二)版本控制管理器值CVS(下)>的文章中,我为大家介绍了CVS这个版本控制器,接下来我继续跟大家分享介绍下一个版本控制管理器--VSS,为什么要说这个版本控制器呢?早已过时的 ... 
- ASP.NET Zero--开发指南
			ASP.NET Zero--开发指南(Lyhcee 译) 01. 前期介绍 02. 前期要求 03. 解决方案结构(层) 04. 前端应用程序 05. 后端应用程序 06.WEB.HOST应用程序 0 ... 
- Oracle 查询权限视图
			在Oracle中有很多用于查权限的视图,但很多人在需要查权限时会很困惑,不知道该用哪个视图去查,这里我列出几个常见的用于查权限的视图及其用法: 1DBA_ROLE_PRIVS 该视图主要有以下2个作用 ... 
- SQLServer之创建视图
			视图定义 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成. 使用SSMS数据库管理工具创建视图 1.连接数据库,选择数据库,展开数据库-> ... 
- Win10解除网速限制让网速飞起来
			Win10隐藏了20%的网速,下面叫你怎么释放它: 1.按Win+R调出运行,输入gpedit.msc点击确定; 2.点击windows设置,右击基于策略Qos,选择高级Qos设置: 3.勾选如图方框 ... 
- 产品设计-后台管理权限设计RBAC
			最近在做OA系统,设计到不同的员工会拥有不同权限对OA进行操作,总结了一下整体的设计 做权限的分配就是为了更好的管理不同类别的员工,如人事部可以看到普通员工的薪酬,可以查看全部员工的考勤数据请假等,而 ... 
- Linux Mysql 每天定时备份
			1.创建脚本 dbback.sh,内容如下: #!/bin/bash mysqldump -uroot -p123456 hexin>/work/db_back/hexin_$(date +%Y ... 
