Cod sursa(job #995016)

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

using namespace std;

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

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

inline void Read()
{
    int delta,d;
    ifstream fin("ecuatie.in");
    fin>>A>>B>>C>>k;
    delta=B*B-4*A*C;
    for(D=0;D*D<delta;D++);
    if(D*D!=delta)
        ok=0;
    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");
    int d,p1,p2,q1,q2,i,val;
    if(!ok)
        fout<<"-1\n";
    else
    {
        val=A;
        if(A<0)
            val=-A;
        for(d=1;d*d<=val;d++)
            if(A%d==0)
            {
                v[++len]=d;
                v[++len]=-d;
                v[++len]=A/d;
                v[++len]=-(A/d);
            }
        if((d-1)*(d-1)==val)
            len-=2;
        //for(i=1;i<=len;i++)
         //   fout<<v[i]<<" ";
        //fout<<"\n";
        for(i=1;i<=len;i++)
        {
            d=v[i];
            if(((B+D)*d)%(2*A)==0 && (B-D)%(2*d)==0)
            {
                sol[++nrsol].p1=d;
                sol[nrsol].p2=A/d;
                sol[nrsol].q1=((B+D)*d)/(2*A);
                sol[nrsol].q2=(B-D)/(2*d);
            }
            if(D!=0 && ((B-D)*d)%(2*A)==0 && (D+B)%(2*d)==0)
            {   sol[++nrsol].p1=d;
                sol[nrsol].p2=A/d;
                sol[nrsol].q1=((B-D)*d)/(2*A);
                sol[nrsol].q2=(D+B)/(2*d);
            }
        }
       // for(i=1;i<=nrsol;i++)
       //     fout<<sol[i].p1<<" "<<sol[i].q1<<" "<<sol[i].p2<<" "<<sol[i].q2<<"\n";
        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;
}