Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Atasamentele paginii Clasament simulare_oni_9_2 | Cod sursa (job #2003090) | Cod sursa (job #1970168)
#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 310;
constexpr double eps = 1e-9;
bool is_zero(const double d){
return -eps <= d && d <= eps; }
int vars = 0, eqs = 0;
double buf[maxn][maxn] = {}, rez[maxn] = {};
bool do_gauss(){
for(int eq = 0, var = 0; eq < eqs && var < vars; ){
int eq_switch = eq;
while(eq_switch < eqs && is_zero(buf[eq_switch][var])) ++eq_switch;
if(eq_switch == eqs){
++var;
continue; }
if(eq_switch != eq) swap_ranges(buf[eq], buf[eq] + vars+1, buf[eq_switch]);
for(int eq_ = eq+1; eq_ < eqs; ++eq_){
const double mult = buf[eq_][var] / buf[eq][var];
for(int var_ = var; var_ <= vars; ++var_)
buf[eq_][var_] -= mult * buf[eq][var_]; }
++var, ++eq; }
for(int eq = 0; eq < eqs; ++eq)
if(all_of(buf[eq], buf[eq]+vars, &is_zero) && !is_zero(buf[eq][vars])) return false;
for(int eq = eqs-1; eq >= 0; --eq){
int var = 0;
while(var < vars && is_zero(buf[eq][var])) ++var;
if(var == vars) continue;
rez[var] = buf[eq][vars];
for(int var_ = var+1; var_ < vars; ++var_)
rez[var] -= buf[eq][var_] * rez[var_];
rez[var] /= buf[eq][var]; }
return true; }
int main(){
ifstream f("gauss.in");
ofstream g("gauss.out");
f >> eqs >> vars;
for(int eq = 0; eq < eqs; ++eq)
for(int var = 0; var <= vars; ++var)
f >> buf[eq][var];
if(!do_gauss()) g << "Imposibil" << endl;
else for(int var = 0; var < vars; ++var) g << fixed << setprecision(10) << rez[var] << ' ';
return 0; }