Cod sursa(job #995045)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 7 septembrie 2013 01:27:12
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <cstdio>
#include <algorithm>
 
using namespace std;
 
int len,v[2000],nrsol,X1,X2,ok=1,D,k;
long long int A,B,C;

struct solutie
{
    int p1,p2,q1,q2;
};
solutie sol[5000];
 
inline void Read()
{
    int d;
    long long int delta;
    freopen ("ecuatie.in","r",stdin);
    scanf("%lld%lld%lld%lld", &A,&B,&C,&k);
    delta=B*B-4*A*C;
    for(D=0;D*D<delta;D++);
    if(D*D!=delta)
        ok=0;
}
 
struct sorting
{
    bool operator () (const solutie& lhs , const solutie& rhs)
    {
        if (lhs.p1 == rhs.p1)
            return lhs.q1 < rhs.q1;
        return lhs.p1 < rhs.p1;
    }
};
 
inline void Solve()
{
    freopen ("ecuatie.out","w",stdout);
    int d,p1,p2,q1,q2,i;
    long long int val1,val2,val3,val;
    if(!ok)
        printf("-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;
        val1=B+D;val2=B-D;val3=2*A;
        for(i=1;i<=len;i++)
        {
            d=v[i];
            if((val1*d)%val3==0 && val2%(2*d)==0)
            {
                sol[++nrsol].p1=d;
                sol[nrsol].p2=A/d;
                sol[nrsol].q1=(val1*d)/val3;
                sol[nrsol].q2=val2/(2*d);
            }
            if(D!=0 && (val2*d)%val3==0 && val1%(2*d)==0)
            {   sol[++nrsol].p1=d;
                sol[nrsol].p2=A/d;
                sol[nrsol].q1=(val2*d)/val3;
                sol[nrsol].q2=val1/(2*d);
            }
        }
        if(nrsol>=k)
        {
            sort(sol+1,sol+nrsol+1,sorting());
            printf("(");
            if(sol[k].p1==-1)
                printf("-");
            else
                if(sol[k].p1!=1)
                    printf("%d", sol[k].p1);
            printf("x");
            if(sol[k].q1!=0)
            {
                if(sol[k].q1>0)
                    scanf("+");
                printf("%d", sol[k].q1);
            }
            printf(")(");
            if(sol[k].p2==-1)
                printf("-");
            else
                if(sol[k].p2!=1)
                    printf("%d", sol[k].p2);
            printf("x");
            if(sol[k].q2!=0)
            {
                if(sol[k].q2>0)
                    printf("+");
                printf("%d", sol[k].q2);
            }
            printf(")\n");
        }
        else
            printf("-1\n");
    }
}
 
int main()
{
    Read();
    Solve();
    return 0;
}