P2455 [SDOI2006]线性方程组

P2455 [SDOI2006]线性方程组

真\(\cdot\)高斯消元模板题
由于各种hack数据被造出来~码量突增~,其实也就多了二三十行
将每行系数消到最多有一个非0数

特殊情况:
在过程同时
没有这元了,则表示有无穷解
发现一行系数都为0,但函数值不为0,则表示无解
最后要注意的是,无穷解的前提是有解

#include <iostream>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
typedef long long LL;
const double eps=1e-8;
double xs[55][55],ans[55];
int n,m,i,j,k;
bool f1=0,f2=0;
inline LL Read(){
    LL x=0,f=1; char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1; c=getchar();
    }
    while(c>='0'&&c<='9')
        x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*f;
}
int main(){
    n=Read();
    for(LL i=1;i<=n;i++)
        for(LL j=1;j<=n+1;j++)
            xs[i][j]=(double)Read();
    LL c=1;
    for(LL i=1;i<=n;i++){
        if(c>n)//每个元都消过了
            break;
        for(LL j=i;j<=n;++j)
            if (abs(xs[j][c])>abs(xs[i][c]))
                for(LL k=1;k<=n+1;++k)
                    swap(xs[i][k],xs[j][k]);

        if (fabs(xs[i][c])<eps){//没有该元
            f2=1;//无穷解
            c++;
            i--;//这行消下一元
            continue;
        }
        for(LL j=i+1;j<=n;++j){
            double t=xs[j][c]/xs[i][c];
            for(LL k=c;k<=n+1;++k)
                xs[j][k]-=xs[i][k]*t;
        }//消掉
        c++;

    }
    c=n;
    for(LL i=n;i>=1;--i){
        if(c<1)
            break;
        if(abs(xs[i][c])<eps)//没有该元
            continue;
        for(LL j=1;j<=i-1;++j){
            double t=xs[j][c]/xs[i][c];
            for(LL k=c;k<=n+1;++k)
                xs[j][k]-=xs[i][k]*t;
        }//其他地方消掉 且不只是改变函数值
        c--;
    }
    for(LL i=n;i>=1;--i){
        f1=0;
        for(LL j=1;j<=n;++j)
            if(fabs(xs[i][j])>eps)
                f1=1;
        if(f1==0&&fabs(xs[i][n+1])>eps){
            puts("-1");
            return 0;
        }//系数为0 函数值不为0
        if(fabs(xs[i][i])>eps)
            if (!f2)
                ans[i]=xs[i][n+1]/xs[i][i];
    }
    if (f2==1){
        puts("0");
        return 0;
    }

    for(LL i=1;i<=n;++i)
        if(fabs(ans[i])<eps)
            printf("x%d=0\n",i);
        else
            printf("x%lld=%.2lf\n",i,ans[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/y2823774827y/p/10214568.html

时间: 2024-10-04 18:31:56

P2455 [SDOI2006]线性方程组的相关文章

【luogu P2455 [SDOI2006]线性方程组】 题解

题目链接:https://www.luogu.org/problemnew/show/P2455 嗯...在消元过程中不要直接拿矩阵元素自己消,会把自己消成0. 1 #include <algorithm> 2 #include <cstdio> 3 #include <cmath> 4 #include <iostream> 5 using namespace std; 6 const int maxn = 200; 7 const double eps

约数相关

约数 约数简介 定义: 若整数 n 除以整数 d 的余数为 0,即 d 能整除 n, 则称 d 是 n,的约数,n 是 d 的倍数,记为 d|n 在算术基本定理中 \(N\)可被分解成下面这个样子 \[N=\prod_{i=1}^m p_i^ {c_i}, \ p_1<p_2<-<p_m , \ c_i ∈ N^*\] 那么\(N\)的正约数个数为: \[(c_i+1)*(c_i+2)*-(c_m+1)=\prod_{i=1}^{m}(c^i+1)\] \(N\)的所有正约数和为: \[

质数筛法详解

理论及实现 定义: 若一个正整数无法被除了1和它本身的之外的任何自然数整除,则称该为质数(素数),否则称该正整数为合数. 判定方法 试除法 引理: 若一个正整数\(N\)为合数,则存在一个能整除\(N\)的数\(T\)且\(2≤T≤ \sqrt N\) 证明就不再赘述,读者可以自行验证: 因此,我们只需要枚举\(2-\sqrt N\).只要这之中的所有数都不能被\(N\)整除,那么\(N\)就是质数了: #include<cmath> bool is_prime(int n) { if(n &

线性方程组之迭代法篇

不管哪一种数值算法,其设计原理都是将复杂转化为简单的重复,或者说,通过简单的重复生成复杂,在算法设计和算法实现过程中,重复就是力量[1].                                 ----题记 一般地,线性方程组可以表达为                                                                                   Ax = b其中,A称为系数矩阵,b称为右端项,x为待求的未知数向量.       迭代

[Matlab]求解线性方程组

转自:http://silencethinking.blog.163.com/blog/static/911490562008928105813169/ AX=B或XA=B在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”.如: X=A\B表示求矩阵方程AX=B的解: X=B/A表示矩阵方程XA=B的解. 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理. 如果矩阵A不是方阵,其维数是m×n,则有: m=

1.1线性方程组

线性方程:包含未知数x1,x2,...,xn 的一个线性方程是形如 a1x1+a2x2+...+anxn = b 的方程,其中b与系数a1,a2,...,an是实数或复数,通常是已知数.下标n可以是任意正整数 线性方程组:由一个或几个包含相同变量x1,x2,...,xn的线性方程组成的.线性方程组的一组解是一组数(s1, s2, ..., sn)

线性方程组的迭代解法数值结果分析

纸上得来终觉浅,绝知此事要躬行. ----(宋)陆游 在使用有限差分法的五点格式求解偏微分方程组时,把问题转化为求解数量级从10直到为10^4个未知数的稀疏矩阵的线性方程组,然后使用了Jocobi迭代,G-S迭代,SOR迭代以及CG迭代求解. 不管从程序的运行时间还是结果精度来看,SOR迭代和CG迭代较另外两种迭代法占优,而数值结果显示SOR迭代和CG迭代的收敛速度基本相当(后者稍微占优一点儿),这和理论的推导结果吻合地很好. 从程序使用的内存空间考虑的话,问题变得复杂了.简言之,CG方法依旧胜

python 求解线性方程组

Python线性方程组求解 求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了.比如我们要求以下方程的解,这是一个非齐次线性方程组: 3x_1 + x_2 - 2x_3 = 5 x_1 - x_2 + 4x_3 = -2 2x_1 + 3x_3 = 2.5 import numpy as np from scipy.linalg import solve a = np.array([[3, 1, -2], [1, -1, 4], [2, 0, 3]]) b

matlab求解线性方程组

模电题现在看来是不用matlab解方程不可做了orz 绝望,各种绝望,平时不努力到了期末季就焦虑得不行. 左除法就好 x=A/b; 如果有符号变量,用syms声明一下就好. 越来越懒了orz好吧,解线性方程组这种毫无技术含量的东西用matlab倒是没啥.但是求积分可不能依赖matlab了,现在我积分水平暴低,简直药丸orz