#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace::std;
const int N=510,M=1050;
#define eps 1e-7
double A[M][N];
double x[N];
int Gauss(int equ,int var){
int row,col;
for(row=0,col=0;col<var&&row<equ;col++,row++){
int max_r=row;
for(int i=row+1;i<equ;i++){
if(fabs(A[i][col])>fabs(A[max_r][col])){
max_r=i;
}
}
if(max_r!=row){
for(int j=col;j<var+1;j++)
swap(A[row][j],A[max_r][j]);
}
if(fabs(A[row][col])<eps){
row--;continue;
}
for(int i=row+1;i<equ;i++){
if(fabs(A[i][col])<eps)continue;
for(int j=col+1;j<var+1;j++){
A[i][j]=(A[i][j]*A[row][col]-A[i][col]*A[row][j])/A[row][col];
}
A[i][col]=0;
}
}
for(int i=row;i<equ;i++){
if(fabs(A[i][col])>eps)return -1;
}
if(row<var)return 0;
for(int i=var-1;i>=0;i--){//计算唯一解。
double tmp=0;
for(int j=i+1;j<var;j++){
tmp+=A[i][j]*x[j];
}
x[i]=(A[i][var]-tmp)/A[i][i];
}
return 1;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
for(int j=0;j<=n;j++)
scanf("%lf",&A[i][j]);
}
int ans=Gauss(m,n);
if(ans==-1)
printf("No solutions\n");
else if(ans==0)
printf("Many solutions\n");
else {
for(int i=0;i<n;i++){
int p=x[i]+eps;
printf("%d\n",p);
}
}
return 0;
}
/*
2 2
1 1 2
1 3 4
2 2
1 1 4
1 1 3
2 2
2 1 5
1 2 4
4 4
1 1 1 7 26
1 3 4 1 18
7 4 1 3 26
5 9 3 1 32
*/
hiho一下 第五十六周 高斯消元·一(高斯消元解整数方程组)
最新推荐文章于 2018-08-06 01:02:07 发布