Cod sursa(job #1835372)

Utilizator cojocarugabiReality cojocarugabi Data 26 decembrie 2016 19:19:15
Problema Algoritmul lui Gauss Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
# include <stdio.h>
# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define IOS ios_base :: sync_with_stdio(0);cin.tie(0)
# define p(v) cerr << #v << " = " << v << '\n'
# define p2(v) cerr << #v << " = " << (complex < int > (v.x,v.y)) << '\n'
# define vi vector < int >
# define vl vector < ll >
# define pii pair < int , int >
# define mp make_pair
# define db long double
# define pb push_back
# define pdd pair < db , db >
# define CF
int main(void)
{
    #ifdef CF
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);
    #endif // CF
    srand(time(0));
    fo << fixed << setprecision(10);
    cerr << fixed << setprecision(10);
    static long double s[333][333];
    static long double v[333][333];
    int n,m;
    fi>>n>>m;
    for (int i = 1;i <= n;++i)
        for (int j = 1;j <= m + 1;++j)
            fi>>s[i][j],v[i][j] = s[i][j];
    static int W[333];
    const long double eps = 1e-6;
    for (int i = 1,j = 1;i <= n && j <= m;++j)
    {
        int cur = i;
        for (int k = i;k <= n;++k)
            if (abs(s[k][j]) > abs(s[cur][j]))
                cur = k;
        if (abs(s[cur][j]) < eps)
            continue;
        W[j] = i;
        if (cur != i)
            for (int k = 1;k <= m + 1;++k)
                swap(s[i][k],s[cur][k]);
        for (int ii = 1;ii <= n;++ii)
            if (ii != i)
            {
                const long double C = s[ii][j] / s[i][j];
                for (int jj = 1;jj <= m + 1;++jj)
                    s[ii][jj] -= s[i][jj] * C;
            }
        ++i;
    }
    static long double ans[333];
    for (int i = 1;i <= m;++i)
        if (!W[i])
            return puts("Imposibil") * 0;
    for (int i = 1;i <= m;++i)
        ans[i] = s[W[i]][m + 1] / s[W[i]][i];
    for (int i = 1;i <= n;++i)
    {
        long double sum = 0;
        for (int j = 1;j <= m;++j)
            sum += v[i][j] * ans[j];
        if (abs(sum - v[i][m + 1]) > eps)
            return puts("Imposibil") * 0;
    }
    for (int i = 1;i <= m;++i)
        fo << ans[i] << " \n"[i == m];
    cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
    return 0;
}