Cod sursa(job #2239870)

Utilizator giotoPopescu Ioan gioto Data 11 septembrie 2018 22:42:26
Problema Ecuatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#pragma GCC optimize ("Ofast")
#include <bits/stdc++.h>
using namespace std;

int a, b, c, k;
int A[50005], B[50005];
inline void afis(int p1, int q1, int p2, int q2){
    printf("(");

    if(abs(p1) != 1) printf("%d", p1);
    else if(p1 == -1) printf("-");
    printf("x");
    if(q1 < 0) printf("-");
    else printf("+");
    if(q1 != 0) printf("%d", abs(q1));

    printf(")");

    printf("(");

    if(abs(p2) != 1) printf("%d", p2);
    else if(p2 == -1) printf("-");
    printf("x");
    if(q2 < 0) printf("-");
    else printf("+");
    if(q2 != 0) printf("%d", abs(q2));

    printf(")");
}
int main()
{
    freopen("ecuatie.in", "r", stdin);
    freopen("ecuatie.out", "w", stdout);

    scanf("%d%d%d%d", &a, &b, &c, &k);

    int NR = 0;
    for(int i = 1; i * i <= abs(a) ; ++i){
        if(a % i == 0){
            A[++NR] = i;
            A[++NR] = -i;
            if(a / i != i){
                A[++NR] = -(a / i);
                A[++NR] = a / i;
            }
        }
    }

    int NR2 = 0;
    for(int i = 1; i * i <= abs(c) ; ++i){
        if(c % i == 0){
            B[++NR2] = i;
            B[++NR2] = -i;
            if(c / i != i){
                B[++NR2] = -(c / i);
                B[++NR2] = c / i;
            }
        }
    }

    sort(A + 1, A + NR + 1);
    sort(B + 1, B + NR2 + 1);

    for(int i = 1; i <= NR ; ++i){
        for(int j = 1; j <= NR2 ; ++j){
            int p1 = A[i], q1 = B[j];
            int p2 = a / p1, q2 = c / B[j];
            if(p1 * q2 + p2 * q1 == b){
                --k;
                if(k == 0) {
                    afis(p1, q1, p2, q2);
                    return 0;
                }
            }
        }
    }
    printf("-1");

    return 0;
}