Pagini recente » Cod sursa (job #2084246) | Cod sursa (job #2950953) | Cod sursa (job #1167117) | Cod sursa (job #2504468) | Cod sursa (job #1802285)
#include <bits/stdc++.h>
using namespace std;
vector<double> operator+(vector<double> a, vector<double> b) {
for(int i = 0; i < a.size(); ++i)
a[i] += b[i];
return a;
}
vector<double> operator*(vector<double> a, double lambda) {
for(int i = 0; i < a.size(); ++i)
a[i] *= lambda;
return a;
}
vector<double> Gauss(vector<vector<double>> Mat) {
int at = 0;
int n = Mat.size();
int m = Mat[0].size() - 1;
for(int it = 0; it <= m; ++it) {
if(at == n) break;
if(it == m) return vector<double>();
for(int i = at; i < n; ++i)
if(abs(Mat[i][it]) > 1e-9) {
swap(Mat[i], Mat[at]);
}
if(abs(Mat[at][it]) > 1e-9) {
Mat[at] = Mat[at] * (1.0 / Mat[at][it]);
for(int i = 0; i < n; ++i)
if(i != at) {
Mat[i] = Mat[i] + Mat[at] * (-Mat[i][it]);
assert(abs(Mat[i][it]) < 1e-9);
}
++at;
}
}
vector<double> ret(m);
for(int it = 0; it < m; ++it) {
for(int i = 0; i < n; ++i)
if(Mat[i][it] > 1e-9)
ret[it] = Mat[i][m];
}
return ret;
}
int main() {
freopen("gauss.in", "r", stdin);
freopen("gauss.out", "w", stdout);
int n, m;
cin >> n >> m;
vector<vector<double>> Mat(n, vector<double>(m + 1));
for(int i = 0; i < n; ++i)
for(int j = 0; j <= m; ++j)
cin >> Mat[i][j];
cout << fixed << setprecision(12);
auto ret = Gauss(Mat);
if(ret.empty()) {
cout << "Imposibil" << endl;
} else {
for(int i = 0; i < m; ++i)
cout << ret[i] << " ";
cout << endl;
}
return 0;
}