Cod sursa(job #2530405)

Utilizator AlexNeaguAlexandru AlexNeagu Data 24 ianuarie 2020 19:17:49
Problema Ecuatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ifstream in("ecuatie.in");
ofstream out("ecuatie.out");
struct ec2 {
 ll a, b, c, d;
};
ll delta(ll a, ll b, ll c) {
ll d = b * b - 4 * a * c;
if (d < 0) {
  return -1;
}
if (sqrt(d) != trunc(sqrt(d))) {
  return -1;
}
return trunc(sqrt(d));
}
bool cmp(ec2 a, ec2 b) {
if (a.a == b.a) {
  return a.b < b.b;
}
return a.a < b.a;
}
vector < ec2 > vek;
int main() {
ll a, b, c, k;
in >> a >> b >> c >> k;
 ll d = delta(a, b, c);
if (d == -1) {
  return out << d << "\n", 0;
}
ll x1 = (-b - d) / (2 * a);
ll x2 = (-b + d) / (2 * a);
if (x1 * (2 * a) != (-b - d) || x2 * (2 * a) != (-b + d)) {
  out << "-1\n";
  return 0;
}
a = abs(a);
for (int i = 1; i * i <= a; i++) {
  if (a % i == 0) {
    ll p1 = i;
    ll p2 = a / p1;
    ll p11 = -i;
    ll p22 = a / p11;
    vek.push_back({p1, -x1 * p1, p2, -x2 * p2});
    vek.push_back({p1, -x2 * p1, p2, -x1 * p2});
    vek.push_back({p11, -x1 * p11, p22, -x2 * p22});
    vek.push_back({p11, -x2 * p11, p22, -x1 * p22});
    if (a / i != i) {
      ll p1 = a / i;
      ll p2 = i;
      ll p11 = - a / i;
      ll p22 = -i;
      vek.push_back({p1, -x1 * p1, p2, -x2 * p2});
      vek.push_back({p1, -x2 * p1, p2, -x1 * p2});
      vek.push_back({p11, -x1 * p11, p22, -x2 * p22});
      vek.push_back({p11, -x2 * p11, p22, -x1 * p22});
    }
  }
}
if (k > vek.size()) {
  out << "-1\n";
  return 0;
}
sort(vek.begin(), vek.end(), cmp);
out << "(";
if (vek[k - 1].a == -1) {
  out << "-";
}
else {
  if (vek[k - 1].a != 1) {
    out << vek[k - 1].a;
  }
}
out << "x";
if (vek[k - 1].b > 0) {
  out << "+";
  out << vek[k - 1].b;
}
else {
  out << vek[k - 1].b;
}
out << ")";
out << "(";
if (vek[k - 1].c == -1) {
  out << "-";
}
else {
  if (vek[k - 1].c != 1) {
    out << vek[k - 1].a;
  }
}
out << "x";
if (vek[k - 1].d > 0) {
  out << "+";
  out << vek[k - 1].d;
}
else {
  out << vek[k - 1].d;
}
out << ")";
return 0;
}