Cod sursa(job #3268143)

Utilizator Alex_BerbescuBerbescu Alexandru Alex_Berbescu Data 13 ianuarie 2025 19:26:07
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#include<bits/stdc++.h>
using namespace std;
long double mat[305][305], ans[305], eps = 1e-10, coef;
int n, m, poz[305];
void interschimb(int i, int j, int l)
{
    for(int k = l; k <= m + 1; ++k)
        swap(mat[i][k], mat[j][k]);
}
ifstream fin("gauss.in");
ofstream fout("gauss.out");
int32_t main(int argc, char * argv[])
{
   fin >> n >> m;
   for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m + 1; ++j)
           fin >> mat[i][j];

for(int i = 1; i <= m + 1; ++i)
    poz[i] = -1;

   int col = 1, row = 1;
   for(row = 1, col = 1; row <= n && col <= m; col++)
   {
       int vl = row;
       for(int i = row; i <= n; ++i)
       {
           if(abs(mat[i][col]) > abs(mat[vl][col]))
             vl = i;

       }
       if(abs(mat[vl][col]) < eps)
           continue;
       interschimb(vl, row, col);
       poz[col] = row;
       for(int i = 1; i <= n; ++i)
       {
           if(i != row)
           {
               coef = mat[i][col] / mat[row][col];
               for(int j = col; j <= m + 1; ++j)
                   mat[i][j] -= (long double)mat[row][j] * coef;
           }
       }
       ++row;
   }

   for(int i = 1; i <= m; ++i)
   {
       if(poz[i] != -1)
           ans[i] = (long double)mat[poz[i]][m + 1] / mat[poz[i]][i];
   }
   for(int i = 1; i <= n; ++i)
   {
       double sum = 0;
       for(int j = 1; j <= m; ++j)
           sum += (double)ans[j] * mat[i][j];
       if(abs(sum - mat[i][m + 1]) > eps)
       {
           fout << "Imposibil";
           return 0;
       }
   }
   fout << fixed << setprecision(10);
   for(int i = 1; i<= m; ++i)
    fout << ans[i] << " ";
   return 0;

}