Cod sursa(job #3256850)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 16 noiembrie 2024 10:59:47
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("gauss.in");
ofstream fout("gauss.out");
typedef long double ld;
const ld EPS=1e-17;
ld v[305][305],sol[305];
int n,m;
bool use[305];
int main()
{
	ios_base::sync_with_stdio(false);
	fin.tie(0);
	fin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m+1;j++)
			fin>>v[i][j];
	int i=1;
	int j=1;
	while(j<=m)
	{
		int lin=0;
		for(int k=i;k<=n;k++)
			if(v[k][j]!=0)
			{
				lin=k;
				break;
			}
		if(lin==0)
		{
			j++;
			continue;
		}
		swap(v[i],v[lin]);
		ld z=v[i][j];
		for(int k=1;k<=m+1;k++)
			v[i][k]/=z;
		for(int k=i+1;k<=n;k++)
		{
			ld u=v[k][j];
			for(int p=1;p<=m+1;p++)
				v[k][p]-=u*v[i][p];
		}
		i++;
		j++;
	}
	for(int i=n;i>=1;i--)
	{
		int who=0;
		ld suma=0;
		for(int j=1;j<=m;j++)
		{
			if(v[i][j]==0)
				continue;
			if(use[j])
			{
				suma+=v[i][j]*sol[j];
				continue;
			}
			use[who]=1;
			who=j;
		}
		if(who==0)
		{
			if(abs(suma-v[i][m+1])>EPS)
			{
				fout<<"Imposibil";
				return 0;
			}
			continue;
		}
		ld val=(v[i][m+1]-suma)/v[i][who];
		sol[who]=val;
		use[who]=1;
	}
	for(int i=1;i<=m;i++)
		fout<<fixed<<setprecision(10)<<sol[i]<<' ';
	return 0;
}