Cod sursa(job #994999)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 6 septembrie 2013 22:45:51
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>
#include <algorithm>

using namespace std;

int len,v[500],nrsol,ok=1;
long long X1,X2,A,B,C,k;

struct solutie
{
    long long p1,p2,q1,q2;
};
solutie sol[1000];

inline void Read()
{
    long long delta,d;
    ifstream fin("ecuatie.in");
    fin>>A>>B>>C>>k;
    delta=B*B-4*A*C;
    for(d=1;d*d<delta;d++);
    if(d*d!=delta)
        ok=0;
    else
    {
        if((-B-d)%(2*A))
            ok=0;
        else
            if((-B+d)%(2*A))
                ok=0;
            else
            {
                X1=(-B-d)/(2*A);
                X2=(-B+d)/(2*A);
            }
    }
    fin.close();
}

inline bool Cmp(const solutie A, const solutie B)
{
    if(A.p1==B.p1)
        return A.q1<B.q1;
    return A.p1<B.p1;
}

inline void Solve()
{
    ofstream fout("ecuatie.out");
    long long d,p1,p2,i,j;
    if(!ok)
        fout<<"-1\n";
    else
    {
        for(d=1;d*d<=A;d++)
            if(A%d==0)
            {
                v[++len]=d;
                v[++len]=-d;
                v[++len]=A/d;
                v[++len]=-(A/d);
            }
        if((d-1)*(d-1)==A)
            len-=2;
        for(i=1;i<=len;i++)
        {
            d=v[i];
            sol[++nrsol].p1=d;
            sol[nrsol].p2=A/d;
            sol[nrsol].q1=(-1)*X1*d;
            sol[nrsol].q2=(-1)*X2*(A/d);
            if(X1!=X2)
            {   sol[++nrsol].p1=d;
                sol[nrsol].p2=A/d;
                sol[nrsol].q1=(-1)*X2*d;
                sol[nrsol].q2=(-1)*X1*(A/d);
            }
        }
        if(nrsol>=k)
        {
            sort(sol+1,sol+nrsol+1,Cmp);
            fout<<'(';
            if(sol[k].p1==-1)
                fout<<"-";
            else
                if(sol[k].p1!=1)
                    fout<<sol[k].p1;
            fout<<'x';
            if(sol[k].q1!=0)
            {
                if(sol[k].q1>0)
                    fout<<'+';
                fout<<sol[k].q1;
            }
            fout<<")(";
            if(sol[k].p2==-1)
                fout<<"-";
            else
                if(sol[k].p2!=1)
                    fout<<sol[k].p2;
            fout<<'x';
            if(sol[k].q2!=0)
            {
                if(sol[k].q2>0)
                    fout<<'+';
                fout<<sol[k].q2;
            }
            fout<<')'<<'\n';
        }
        else
            fout<<"-1\n";
    }
    fout.close();
}

int main()
{
    Read();
    Solve();
    return 0;
}