Cod sursa(job #2415418)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 25 aprilie 2019 23:13:42
Problema Ecuatie Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;

ifstream fin("ecuatie.in");
ofstream fout("ecuatie.out");

int A,B,C,a,b,c,k,d,p1,p2,q1,q2,u1,u2,i,j,cnt;
int v[1000000],w[1000000];

void af(int a, int b, int c, int d){
    fout<<"(";

    if(a<0)
        fout<<"-";
    if(fabs(a)!=1)
        fout<<fabs(a);
    fout<<"x";

    if(b<0)
        fout<<"-";
    else
        fout<<"+";
    fout<<fabs(b);

    fout<<")(";

    if(c<0)
        fout<<"-";
    if(fabs(c)!=1)
        fout<<fabs(c);
    fout<<"x";

    if(d<0)
        fout<<"-";
    else
        fout<<"+";
    fout<<fabs(d);

    fout<<")";
}

int main(){
    fin>>A>>B>>C>>k;
    a=max(A,-A);
    b=max(B,-B);
    c=max(C,-C);

    if(B*B-4*A*C<0){
        fout<<-1;
        return 0;
    }else{
        if(sqrt(B*B-4*A*C)*sqrt(B*B-4*A*C)!=B*B-4*A*C){
            fout<<-1;
            return 0;
        }
    }

    for(d=1;d*d<=c;d++)
        if(c%d==0){
            w[++u2]=d;
            w[++u2]=-d;
            if(d!=c/d)
                w[++u2]=c/d,w[++u2]=-c/d;
        }
    sort(w+1,w+u2+1);

    for(d=1;d*d<=a;d++)
        if(a%d==0){
            v[++u1]=d;
            v[++u1]=-d;
            if(d!=a/d)
                v[++u1]=a/d,v[++u1]=-a/d;
        }
    sort(v+1,v+u1+1);

    for(i=1;i<=u1;i++){
        for(j=1;j<=u2;j++){
            p1=v[i]; p2=A/v[i];
            q1=w[j]; q2=C/w[j];

            if(p1*q2+p2*q1==B)
                cnt++;

            if(cnt==k){
                af(p1,q1,p2,q2);

                return 0;
            }
        }
    }

    fout<<-1;

    return 0;
}