Cod sursa(job #2120339)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 2 februarie 2018 12:33:50
Problema Ecuatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <cstdio>
#include <algorithm>
#include <cstdlib>

FILE *fin = fopen("ecuatie.in", "r"), *fout = fopen("ecuatie.out", "w");

#define MAXN 10000

struct myc {
    int x, y;
    inline bool operator < (const myc &u) const {
        if (x != u.x) return x < u.x;
        else return y < u.y;
    }
} v[MAXN], u[MAXN];

inline void divizori(int a, int &n, myc v[]) {
    int x = a;
    if (a < 0)
        x = -a;

    n = 0;
    for (int i = 1; i * i <= x; i++) {
        if (x % i == 0) {
            if (i * i == x) {
                v[n++] = {i, a / i};
                v[n++] = {-i, -a / i};
            } else {
                v[n++] = {i, a / i};
                v[n++] = {-i, -a / i};
                v[n++] = {a / i, i};
                v[n++] = {-a / i, -i};
            }
        }
    }

    std::sort(v, v + n);
}

inline void afis(int p, int q) {
    fputc('(', fout);
    if (p == -1)
        fputc('-', fout);
    else if (p != 1)
        fprintf(fout, "%d", p);
    fputc('x', fout);
    if (q > 0)
        fputc('+', fout);
    fprintf(fout, "%d)", q);
}

inline void nou(int &k, int i, int j) {
    k--;
    if (k)
        return ;

    afis(v[i].x, u[j].x);
    afis(v[i].y, u[j].y);

    exit(0);
}

int main() {
    int a, b, c, k, n, m;
    fscanf(fin, "%d%d%d%d", &a, &b, &c, &k);

    divizori(a, n, v);
    divizori(c, m, u);

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (v[i].x * u[j].y + v[i].y * u[j].x == b)
                nou(k, i, j);

    fprintf(fout, "-1");

    fclose(fin);
    fclose(fout);
    return 0;
}