Cod sursa(job #2530398)

Utilizator AlexNeaguAlexandru AlexNeagu Data 24 ianuarie 2020 19:10:35
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;
  cin >> a >> b >> c >> k;
   ll d = delta(a, b, c);
  if (d == -1) {
    return cout << d << "\n", 0;
  }
  ll x1 = (-b - d) / (2 * a);
  ll x2 = (-b + d) / (2 * 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});
      }
    }
  }
  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;
}