果然如Miracle学长所说。。。调了一天。。。qwq。。还是过不了线下的Hack
upd after 40min:刚刚过了
就是多了一个判无解的操作。。。
当系数都为0,且常数项不为0时,即为无解。
当找到自由元时,不能跳过这一行。。。否则会被Hack,见洛谷讨论
#include<cstdio> #include<iostream> #include<cmath> #define R register int using namespace std; const double eps=1E-6; inline int g() { R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix; do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix; } long double a[55][55]; int n,m,k; inline bool ck0(double x) {return x<eps&&x>-eps;} inline void Gauss() { for(R i=1,pos=1;i<=n&&pos<=n;++i) { R p; for(p=pos;p<=n&&ck0(a[p][i]);++p) ; if(p==n+1) continue; if(pos!=p) for(R j=1;j<=n+1;++j) swap(a[pos][j],a[p][j]); for(R j=pos+1;j<=n;++j) if(!ck0(a[j][i])){ register long double t=a[j][i]/a[pos][i]; for(R k=1;k<=n+1;++k) a[j][k]-=a[pos][k]*t; } ++pos; } register bool flg1=false,flg2=false; for(R i=1;i<=n;++i) { R j=1; while(ck0(a[i][j])&&j<=n+1) ++j; if(j==n+1) flg1=true; if(j>n+1) flg2=true; } if(flg1) {putchar('-'),putchar('1'); return ;} if(flg2) {putchar('0'); return ;} for(R i=n;i>=1;--i) { for(R j=n;j>=i+1;--j) a[i][n+1]-=a[i][j]*a[j][n+1]; a[i][n+1]/=a[i][i]; } for(R i=1;i<=n;++i) if(ck0(a[i][n+1])) printf("x%d=0 ",i); else printf("x%d=%.2Lf ",i,a[i][n+1]); } signed main() { n=g(); for(R i=1;i<=n;++i) for(R j=1;j<=n+1;++j) a[i][j]=g(); Gauss(); //while(1); }
2019.05.13