P2455 [SDOI2006]线性方程组

Posted y2823774827y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",i); 
        else
            printf("x%lld=%.2lf
",i,ans[i]);
    return 0;
}

以上是关于P2455 [SDOI2006]线性方程组的主要内容,如果未能解决你的问题,请参考以下文章

[Luogu2455] [SDOI2006]线性方程组

[SDOI2006] 二进制方程

题解 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)

SDOI2006 保安站岗

题解 P2458 [SDOI2006]保安站岗

P2458 [SDOI2006]保安站岗