Pagini recente » Istoria paginii runda/pregatire_oni2011_runda3/clasament | Cod sursa (job #1344933) | Monitorul de evaluare | Cod sursa (job #1817568) | Cod sursa (job #1210546)
#include <cstdio>
#include <algorithm>
using namespace std;
FILE *f=fopen ("gauss.in","r");
FILE *g=fopen ("gauss.out","w");
#define eps 0.0000001
double v[305][305],sol[305];
int n,m;
inline void swapline (int x, int y){
for (int i=1;i<=m;++i) swap (v[x][i],v[y][i]);
}
int main(){
fscanf (f,"%d%d",&n,&m);
for (int i=1;i<=n;++i){
for (int j=1;j<=m+1;++j){
fscanf (f,"%lf",&v[i][j]);
}
}
int i=1,j=1,k;
while (i<=n && j<=m){
for (k=i;k<=n;++k){
if (v[k][j]>eps || v[k][j]<-eps){
break;
}
}
if (k>n){
j++;
continue;
}
if (k!=i) swapline (i,k);
for (k=j+1;k<=m+1;++k) v[i][k]/=v[i][j];
v[i][j]=1;
for (k=i+1;k<=n;++k){
for (int l=j+1;l<=m+1;++l){
v[k][l]-=v[k][j]*v[i][l];
}
v[k][j]=0;
}
i++; j++;
}
for (i=n;i>=1;--i){
for (j=1;j<=m+1;++j){
if (v[i][j]>eps || v[i][j]<-eps){
if (j>m){
fprintf (g,"Imposibil");
return 0;
}
sol[j]=v[i][m+1];
for (k=j+1;k<=m;++k){
sol[j]-=v[i][k]*sol[k];
}
break;
}
}
}
for (i=1;i<=m;++i) fprintf (g,"%.8lf ",sol[i]);
return 0;
}