#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
void Gauss(const vector<vector<double>> A, const vector<double> b, vector<double>& otv)
//A - n*n
//b - (n)
//otv - (n)
{
int n,i,j,k;
double mom,mom1;
vector<vector<double>> s;
n=A.size();
s.resize(n);
for (i=0;i<n;i++)
s[i].resize(n+1);
for (i=0;i<n;i++){
for (j=0;j<n;j++)
s[i][j]=A[i][j];
s[i][n]=b[i];
}
for (k=0;k<n;k++){
mom=s[k][k];
i=k;
for (j=k+1;j<n;j++)
if (fabs(mom)<fabs(s[j][k])) {
mom=s[j][k];
i=j;
}
mom1=s[i][k];
for (j=k;j<=n;j++){
mom=s[i][j];
s[i][j]=s[k][j];
s[k][j]=mom/mom1;
}
for (i=k+1;i<n;i++){
mom=-s[i][k];
for (j=k+1;j<=n;j++)
s[i][j]=s[k][j]*mom+s[i][j];
s[i][k]=0.0;
}
}
for (k=n-1;k>0;k--)
for (i=k-1;i>=0;i--){
s[i][n]=s[i][n]-s[k][n]*s[i][k];
s[i][k]=0.0;
}
/*for (i=0;i<n;i++){ //
otv[i]=0;
for (j=0;j<n;j++)
otv[i]=otv[i]+m[i][j]*s[j][n];
end;*/
otv.resize(n);
for (i=0;i<n;i++)
otv[i]=s[i][n];
for (i=0;i<n;i++)
s[i].clear();
s.clear();
}
void main()
{
vector<vector<double>> m;
vector<double> b,otv;
int i;
m.resize(3);
for (i=0;i<3;i++)
m[i].resize(3);
b.resize(3);
/*
x+y=3
2x-y+3z=9
2y-z=1
: x=1, y=2, z=3*/
//
m[0][0]=1;
m[0][1]=1;
m[0][2]=0;
b[0]=3;
//
m[1][0]=2;
m[1][1]=-1;
m[1][2]=3;
b[1]=9;
//
m[2][0]=0;
m[2][1]=2;
m[2][2]=-1;
b[2]=1;
Gauss(m,b,otv);
for (int i=0;i<otv.size();i++)
cout<<otv[i]<<endl;
}