Cod sursa(job #1821236)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 2 decembrie 2016 20:25:50
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;
typedef double f64;

const int SPQR = 305;
const f64 EPS = 1e-7; // ma gandesc serios sa ma las...

valarray<f64> gs[SPQR];
vector<f64> vals;

inline bool eq(const f64 &a, const f64 &b) {
    return abs(a - b) < EPS; }

int main(void) {
    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);
    int n, m;

    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i) {
        gs[i].resize(m + 1);
        for (int j = 0; j <= m; ++j)
            scanf("%lf", &gs[i][j]); }

    for (int k, i = 0, j = 0; i < n && j < m; ++j) {
        if (eq(gs[i][j], 0.0)) {
            for (k = i + 1; k < n; ++k) if (eq(gs[k][j], 0.0)) {
                swap(gs[i], gs[k]);
                break; }
            if (k == n)
                continue; }

        for (k = 0; k < n; ++k) if (k != i && !eq(gs[k][j], 0.0))
            gs[k]-= gs[i] * (gs[k][j] / gs[i][j]);
        ++i; }

    vals.resize(m);
    for (int j, i = 0; i < n; ++i) {
        for (j = 0; j < m; ++j)
            if(!eq(gs[i][j], 0.0)) {
                vals[j] = gs[i][m] / gs[i][j];
                break; }
        if (j == m && !eq(gs[i][j], 0.0)) {
            puts("Imposibil");
            return 0; } }

    for (auto i: vals)
        printf("%.10f ", i);
    printf("\n");

    return 0; }