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 ...
随机推荐
- 9个Console命令
九个Console命令,让js调试更简单 By.cllgeek 一.显示信息的命令 1: <!DOCTYPE html> 2: <html> 3: <head> 4 ...
- 【20190415】JavaScript-事件流与stopPropagation()、stopImmediatePropagation()的误区解析
这两天仔细看了一下MDN上关于事件流机制和相关方法的文档,发现有个很大的误区.过去我一直以为stopPropagation()就是用来阻止事件冒泡的,甚至很多博客和菜鸟教程上都是这样写的.但实际上文档 ...
- 无依赖简单易用的Dynamics 365实体记录数计数器并能计算出FetchXml返回的记录数
本人微信公众号:微软动态CRM专家罗勇 ,回复278或者20180812可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我们 ...
- PHP如何实现在数据库随机获取几条记录
本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法.PHP实例分享给大家供大家参考,具体如下: 为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法 ...
- 利用ZYNQ SOC快速打开算法验证通路(3)——PS端DMA缓存数据到PS端DDR
上篇该系列博文中讲述W5500接收到上位机传输的数据,此后需要将数据缓存起来.当数据量较大或者其他数据带宽较高的情况下,片上缓存(OCM)已无法满足需求,这时需要将大量数据保存在外挂的DDR SDRA ...
- 【PAT】B1016 部分A+B
水题 以字符和字符串形式储存输入,比较,计算出两个个数的D的个数,用for循环拼成P,相加得出结果 #include<stdio.h> int main(){ char A[20],DA, ...
- 浅谈百度地图API的坑
我们可以使用百度地图生成器生成地图码(功能开发 还是使用官方文档吧) 注意百度地图坑 1.地图和我们申请的ak码版本问题 (解决方案:推荐大家使用2.0) 远程链接:<script type=& ...
- Dockerfile Volume指令与docker -v的区别
在学习Dockerfile的过程中有个VOLUME命令,很多教程或书中说的是用来定义匿名卷的,其作用如下: 容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文 ...
- centos7下git版本升级及gitlab安装
centos系统自带的git版本过低,当使用git拉取.推送.克隆的时候可能会报错,常见的错误: error: The requested URL returned error: 401 Unauth ...
- Taro文件上传:Blob Url下载Blob对象本身并通过接口上传到服务器
最近项目的文件上传遇到一个问题,就是Taro的chooseImage传给回调的是一个Blob对象,一般来说,上传控件都会导出Data Url,而Taro给了一个Blob Url,问题在于,我直接令im ...