Pagini recente » Cod sursa (job #2324495) | Cod sursa (job #1704211) | Cod sursa (job #1118839) | Cod sursa (job #953730) | Cod sursa (job #2847435)
#include <bits/stdc++.h>
using namespace std;
#ifdef INFOARENA
ifstream fin("gauss.in");
ofstream fout("gauss.out");
#else
ifstream fin("ciorna.in");
ofstream fout("ciorna.out");
#endif // INFOARENA
using ld = long double;
const ld eps = 1e-10;
vector <ld> gaussian(vector <vector <ld>> a) {
int n = a.size(), m = a[0].size() - 1;
vector <ld> sol(m, 0);
int curr = 0;
vector <int> where(m, -1);
for(int l = 0; l < m && curr < n; l++) {
int best = curr;
for(int i = curr + 1; i < n; i++)
if(abs(a[i][l]) > abs(a[best][l]))
best = i;
if(abs(a[best][l]) < eps) continue;
where[l] = curr;
swap(a[curr], a[best]);
for(int i = 0; i < n; i++) if(i != curr) {
ld sub = a[i][l] / a[curr][l];
for(int j = l; j <= m; j++)
a[i][j] -= a[curr][j] * sub;
}
curr++;
}
for(int i = 0; i < m; i++)
if(where[i] >= 0)
sol[i] = a[where[i]][m] / a[where[i]][i];
for(int i = 0; i < n; i++) {
ld sum = 0;
for(int j = 0; j < m; j++)
sum += sol[j] * a[i][j];
if(abs(sum - a[i][m]) >= eps)
return {};
}
return sol;
}
int main()
{
int n, m;
fin >> n >> m;
vector <vector <ld>> a(n);
for(int i = 0; i < n ; i++) {
a[i].resize(m + 1);
for(int j = 0; j <= m; j++)
fin >> a[i][j];
}
vector <ld> sol = gaussian(a);
if(!sol.size()) return !bool(fout << "Imposibil");
fout << fixed << setprecision(10);
for(ld x : sol)
fout << x << " ";
return 0;
}