Pagini recente » Istoria paginii runda/concurs_11_12_02_26 | Atasamentele paginii Clasament paranteze | Cod sursa (job #2350693) | Cod sursa (job #1205569)
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#define Nmax 305
#define EPS 0.00001
using namespace std;
double A[Nmax][Nmax];
double X[Nmax];
int N,M;
void read()
{
scanf("%d%d",&N,&M);
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M + 1; ++j)
scanf("%lf",&A[i][j]);
}
void swap_line(int i,int k)
{
for(int j = 1; j <= M + 1; ++j)
swap(A[i][j],A[k][j]);
}
int goala(int k)
{
for(int j = 1; j <= M; ++j)
if(fabs(A[k][j]) >= EPS)
return 0;
return 1;
}
void gauss()
{
int i,j,k,l;
double value;
for(i = 1, j = 1; i <= N && j <= M; ++i,++j)
{
for(k = i; k <= N; ++k)
if(fabs(A[k][j]) > EPS)
break;
if(k == N + 1)continue;
if(i != k) swap_line(i,k);
for(k = i + 1; k <= N; ++k)
{
value = A[k][j]/A[i][j];
for(l = j; l <= M + 1; ++l)
{
A[k][l] = A[k][l] - value * A[i][l];
if( fabs(A[k][l]) <= EPS)
A[k][l] = 0;
}
}
}
while(goala(N) && N >= 1)
--N;
}
void get_answers()
{
int i,j,k,l;
for(i = N; i >= 1; --i)
{
for(j = 1; j <= M && fabs(A[i][j]) <= EPS; ++j);
if(j == M + 1 || N < M){
printf("Imposibil\n");
exit(0);
}
X[i] = A[i][M+1];
for(k = j + 1; k <= M; ++k)
X[i] -= X[k]*A[i][k];
X[i] /= A[i][j];
}
}
void print_answers()
{
for(int i = 1; i <= M; ++i){
printf("%.8lf ",X[i]);
}
}
int main()
{
freopen("gauss.in","r",stdin);
freopen("gauss.out","w",stdout);
read();
gauss();
get_answers();
print_answers();
return 0;
}