【洛谷P3389 【模板】高斯消元法】

这是个版子题,当然本蒟蒻也是看了好几天才明白
对于这样的线性方程组,我们可以看成是一个矩阵

对于百度百科给的定义(我感到很迷)赶脚和行列式有的一拼
但我们要注意的是:
行列式是一个确切的值(有关行列式求值,下片博文再说),可以看做是一个数值;
而矩阵不同,矩阵是一个数表,无特殊的值。当然,性质也略有不同(这里就先不细讲了)
高斯消元的核心就是把这个n*n的矩阵消成一个对角矩阵(就是除了a【i】【i】为1以外,其余全为零但是不要乱划a【i】【n+1】这是我们要输出的东西)然后就ok了
其中一些性质可以通过度娘或下面的(李昊的)过程代码验证一下
//这不是AC代码,只是一个检测的(黈力的小心一点啊QAQ)
#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(){
freopen("1.txt","r",stdin);
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)
if(i!=j){
double kk=a[j][i];
rep(k,,n+)
a[j][k]-=kk*a[i][k];
}
puts("------------");
rep(j,,m){
rep(k,,n+)cout<<a[j][k]<<" ";
puts("");
}
}
if(flag){
rep(i,,m)
if(!check(i)){
printf("No solution\n");
return ;
}
printf("So many solutions\n");
} }
通过这个代码,可以看到化简的每一步过程
下面才是真正的AC代码:
//真正的AC代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,s;
double a[][];
int main()
{
cin>>n;
for(int i=;i<=n;i++)//输入矩阵
for(int j=;j<=n+;j++)//别忘记最后那一列
cin>>a[i][j];
for(int i=;i<=n;i++)
{
s=i;
while(a[s][i]==&&s<=n)
s++;
if(s==n+)
{
cout<<"No Solution";//判是否有解(若有一行或一列全为0,则无解)
return ;
}
for(int j=;j<=n+;j++)
swap(a[i][j],a[s][j]);
double k=a[i][i];
for(int j=;j<=n+;j++)
a[i][j]=a[i][j]/k; //为防止a【i】【i】为零,可以换一下
for(int j=;j<=n;j++)
{
if(i!=j)
{
double ki=a[j][i];
for(int m=;m<=n+;m++)
a[j][m]=a[j][m]-ki*a[i][m];//这就保证可以将除了a【i】【i】的全部为0
}
}
}
for(int i=;i<=n;i++)
printf("%.2lf\n",a[i][n+]);//输出ouo
return ;
}
这其中用到了一些神奇的性质,还是提前掌握为妙
【洛谷P3389 【模板】高斯消元法】的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
- [洛谷P3806] [模板] 点分治1
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...
随机推荐
- 或许,挂掉的点总是出人意料(hw其实蛮有好感的公司)
1:问了有没有考研的打算,为什么: ` 实验室指导自己的两个学长, 他们两个都是不考研党派,当然两个学长本科都进入了不错的公司hw,xm,耳濡目染就自己也就不想去考研了: 跟一些已经工作的程序员聊天, ...
- sql左外连接和右外连接的区别例子转摘
sql左外连接和右外连接的区别 两个表:A(id,name)数据:(1,张三)(2,李四)(3,王五)B(id,name)数据:(1,学生)(2,老师)(4,校长) 左连接结果:select A. ...
- Python第六天 类型转换
Python第六天 类型转换 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Python第二天 变量 运算符与表达式 input()与raw_inp ...
- 【原】Java学习笔记002 - JAVA SE编码规范
/* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...
- 9102 IT人保持记忆力及健康的方法
做技术时间久了,我们会发现有的时候我们会感觉记忆力衰减太快,前脚刚忙完的事或者刚做完计划任务没多久就遗忘了,或者是以前轻车熟入的方法死活都记不起来了,亦或者之前学习一门技术很快就掌握真谛,现在即便花N ...
- Java - String 的字面量、常量池、构造函数和intern()函数
一.内存中的 String 对象 Java 的堆和栈 对于基本数据类型变量和对象的引用,也就是局部变量表属于栈内存: 而通过 new 关键字和 constructor 创建的对象存放在堆内存: 直接的 ...
- ASP.NET -- WebForm -- ScriptManager 类
ASP.NET -- WebForm -- ScriptManager 类 通过 ScriptManager 可注册随后将作为页面一部分呈现的脚本. 1. 注册并立即执行脚本. --RegisterS ...
- python 结巴分词学习
结巴分词(自然语言处理之中文分词器) jieba分词算法使用了基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能生成词情况所构成的有向无环图(DAG), 再采用了动态规划查找最大概率路径,找出基于 ...
- 【Python 19】BMR计算器3.0(字符串分割与格式化输出)
1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...
- HBase Client JAVA API
旧 的 HBase 接口逻辑与传统 JDBC 方式很不相同,新的接口与传统 JDBC 的逻辑更加相像,具有更加清晰的 Connection 管理方式. 同时,在旧的接口中,客户端何时将 Put 写到服 ...