Cod sursa(job #340021)

Utilizator DraStiKDragos Oprica DraStiK Data 12 august 2009 17:39:18
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <algorithm>
#include <set>
#include <cstdlib>
#include <cmath>
using namespace std;

#define in insert
#define mp make_pair
#define p1 first.first
#define q1 first.second
#define p2 second.first
#define q2 second.second

set <pair <pair <int,double>,pair <int,double> > > v;
char s[10],aux[10];
int a,b,c,k,P1,Q1,P2,Q2;
double d,x1,x2;

void ecuatie ()
{
    d=sqrt (b*b-4*a*c);
    if ((double)d!=(int)d)
        exit (0);
    x1=(double)(-b+d)/(2*a);
    x2=(double)(-b-d)/(2*a);
}

void divizori ()
{
    int i,lim;

    for (lim=abs (a), i=1; i*i<=lim; ++i)
    {
        if ((int)(-x1*i)==(double)(-x1*i) && (int)(-x2*(a/i))==(double)(-x2*(a/i)))
        {
            v.in (mp (mp (i,-x1*i),mp (a/i,-x2*(a/i))));
            v.in (mp (mp (-i,x1*i),mp (-a/i,x2*(a/i))));
            v.in (mp (mp (a/i,-x2*(a/i)),mp (i,-x1*i)));
            v.in (mp (mp (-a/i,x2*(a/i)),mp (-i,x1*i)));
        }
        if ((int)(-x2*i)==(double)(-x2*i) && (int)(-x1*(a/i))==(double)(-x1*(a/i)))
        {
            v.in (mp (mp (i,-x2*i),mp (a/i,-x1*(a/i))));
            v.in (mp (mp (-i,x2*i),mp (-a/i,x1*(a/i))));
            v.in (mp (mp (a/i,-x1*(a/i)),mp (i,-x2*i)));
            v.in (mp (mp (-a/i,x1*(a/i)),mp (-i,x2*i)));
        }
    }
}

void baga (int nr, int &start)
{
    int i,j;

    for (i=0; nr; ++i, nr/=10)
        aux[i]=nr%10+'0';
    aux[i]='\0';
    for (j=start; j<start+i; ++j)
        s[j]=aux[i-(j-start+1)];
}

void solve ()
{
    set <pair <pair <int,double>,pair <int,double> > > :: iterator it;
    int i,nr;

    for (i=1, it=v.begin (); i<=k && it!=v.end (); ++i, ++it)
    {
        P1=it->p1;
        Q1=(int)it->q1;
        P2=it->p2;
        Q2=(int)it->q2;
    }
    if (i!=k+1)
        printf ("-1");
    else
    {
        s[nr=0]='(';
        if (P1!=1)
            baga (P1,++nr);
        s[++nr]='x';
        if (Q1<0)
            s[++nr]='-';
        else
            s[++nr]='+';
        baga (abs (Q1),++nr);
        s[++nr]=')';
        s[++nr]='(';
        if (P2!=1)
            baga (P2,++nr);
        s[++nr]='x';
        if (Q2<0)
            s[++nr]='-';
        else
            s[++nr]='+';
        baga (abs (Q2),++nr);
        s[++nr]=')';
        s[++nr]='\0';
        printf ("%s",s);
    }
}

int main ()
{
    freopen ("ecuatie.in","r",stdin);
    freopen ("ecuatie.out","w",stdout);

    scanf ("%d%d%d%d",&a,&b,&c,&k);
    ecuatie ();
    divizori ();
    solve ();

    return 0;
}