Cod sursa(job #1462349)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 17 iulie 2015 20:20:53
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
int a, b, c, k, i, nr, delta, nr1;
double X1, X2;
struct res{
    int p1;
    int q1;
    int p2;
    int q2;
};
res sol[10000];
void f(int d){
    int P1, P2;
    double Q1, Q2;
    P1 = d;
    P2 = a / d;
    Q1 = -X1 * d;
    Q2 = -X2 * (a / d);
    if(Q1 == (int) Q1 && Q2 == (int) Q2){
        nr++;
        sol[nr].p1 = P1;
        sol[nr].q1 = Q1;
        sol[nr].p2 = P2;
        sol[nr].q2 = Q2;
    }

    Q1 = -X2 * d;
    Q2 = -X1 * (a / d);
    if(Q1 == (int) Q1 && Q2 == (int) Q2){
        nr++;
        sol[nr].p1 = P1;
        sol[nr].q1 = Q1;
        sol[nr].p2 = P2;
        sol[nr].q2 = Q2;
    }
}
ifstream fin("ecuatie.in");
ofstream fout("ecuatie.out");
int modul(int x){
    if(x >= 0){
        return '+';
    }
}
int cmp(res a, res b){
    if(a.p1 == b.p1){
        return a.q1 < b.q1;
    }
    return a.p1 < b.p1;
}
char semn(int &x){
    if(x > 0){
        return '+';
    }
    x = -x;
    return '-';
}
int main(){
    fin>> a >> b >> c >> k;
    delta = b * b - 4 * a * c;
    if(sqrt(delta * 1.0) != (int) sqrt(delta * 1.0)){
        fout<<"-1\n";
        return 0;
    }
    delta = sqrt(delta * 1.0);
    X1 = (- b - delta) / (2 * a);
    X2 = (- b + delta) * 1.0 / (2 * a);
    for(i = 1; i * i <= modul(a); i++){
        if(a % i == 0){
            f(i);
            f(-i);
            f(a / i);
            f(-a / i);
        }
    }
    sort(sol + 1, sol + nr + 1, cmp);
    for(i = 1; i <= nr; i++){
        if(!(sol[i].p1 == sol[i - 1].p1 && sol[i].q1 == sol[i-1].q1)){
            nr1++;
        }
        if(nr1 == k){
            if(sol[i].p1 == 1){
                fout<<"(x";
            }
            else{
                if(sol[i].p1 == -1){
                    fout<<"(-x";
                }
                else{
                    fout<<"("<<sol[i].p1 <<"x";
                }
            }
            //fout<<"("<<sol[i].p1 <<"x";
            if(sol[i].q1 >= 0){
                fout<<"+";
            }
             fout<< sol[i].q1 <<")(";
              if(sol[i].p2 == 1){
                fout<<"x";
            }
            else{
                if(sol[i].p2 == -1){
                    fout<<"-x";
                }
                else{
                    fout<<sol[i].p2 <<"x";
                }
            }
              if(sol[i].q2 >= 0){
                fout<<"+";
            }
             fout<< sol[i].q2 <<")\n";
            return 0;
        }
    }
    if(nr1 < k){
        fout<<"-1\n";
    }
    return 0;
}