Cod sursa(job #418261)

Utilizator SpiderManSimoiu Robert SpiderMan Data 15 martie 2010 18:30:31
Problema Ecuatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <cmath>
using namespace std;

const char iname[]="ecuatie.in";
const char oname[]="ecuatie.out";
const int maxn=100000;

ifstream f(iname);
ofstream g(oname);

typedef long long inti;

inti n,divz[maxn],i,j,a,b,c,k,p,ap,q1p,q2p,aux,p1,q1,p2,q2,delta,x1,x2;

void afis(inti p1,inti q1,inti p2,inti q2)
{
    g<<"(";
    if(p1<0)
        p1=-p1,g<<"-";
    if(p1!=1)
        g<<p1<<"x";
    else
        g<<"x";

    if(q1<0)
        g<<"-",q1=-q1;
    else
        g<<"+";
    g<<q1<<")(";

    if(p2<0)
        p2=-p2,g<<"-";
    if(p2!=1)
        g<<p2<<"x";
    else
        g<<"x";

    if(q2<0)
        g<<"-",q2=-q2;
    else
        g<<"+";
    g<<q2<<")\n";
}

int main()
{
    f>>a>>b>>c>>k;

    delta=b*b-(a*c<<2);
    if (sqrt(delta)==(inti)sqrt(delta)) delta=(inti)sqrt(delta);
    else
    {
        g<<"-1";
        f.close();
        g.close();

        return 0;
    }

    x1=-b-delta;
    x2=-b+delta;
    ap=abs(a);

    for(i=1;i*i<=ap;++i)
        if(i*(ap/i)==ap)
            if(i==ap/i)
                divz[++p]=-i,divz[++p]=i;
            else
                divz[++p]=-i,divz[++p]=i,divz[++p]=ap/i,divz[++p]=-ap/i;

    sort(divz+1,divz+p+1);
    for(i=1;i<=p;++i)
    {
        p1=divz[i];
        p2=a/divz[i];
        q1=-divz[i]*x1;
        q2=-a/divz[i]*x2;
        q1p=-divz[i]*x2;
        q2p=-a/divz[i]*x1;
        if((a>0&&q1>q1p)||(a<0&&q1<q1p)||(a>0&&q2>q2p)||(a<0&&q2<q2p))
            aux=q1,q1=q1p,q1p=aux,aux=q2,q2=q2p,q2p=aux;
        if(q1%(ap<<1)==0&&q2%(ap<<1)==0)
        {
            --k;
            if(k==0)
            {
                afis(p1,(q1/2)/a,p2,(q2/2)/a);

                f.close();
                g.close();

                return 0;
            }
        }
        if(q1p%(ap<<1)==0&&q2p%(ap<<1)==0)
        {
            --k;
            if(k==0)
            {
                afis(p1,(q1p/2)/a,p2,(q2p/2)/a);

                f.close();
                g.close();

                return 0;
            }
        }
    }

    g<<"-1";
    f.close();
    g.close();

    return 0;
}