Cod sursa(job #1965094)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 13 aprilie 2017 22:33:29
Problema Ecuatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<fstream>
#include<math.h>
#include<vector>
#include<algorithm>

using namespace std;
ifstream fin("ecuatie.in");
ofstream fout("ecuatie.out");
long long a,b,c,k,d,x,q,p,aux, an,am, imp, nn, mm;
long long i, aux1,z;
long long m,n,el;
vector <pair<long long, long long> > v;

long long cmmdc(long long n, long long m)
{
    long long r;
    while(m>0)
    {
        r=n%m;
        n=m;
        m=r;
    }
    return n;
}

void afis(long long p, long long q)
{
    if(p==1)
        fout<<"("<<"x";
    else
        if(p==-1)
            fout<<"("<<"-x";
        else
            fout<<"("<<p<<"x";
    if(q<0)
        fout<<"-"<<-q<<")";
    else
        fout<<"+"<<q<<")";
}

int main()
{
    fin>>a>>b>>c>>k;
    d=b*b-4*a*c;
    n=-b-long(sqrt(d));
    m=-b+long(sqrt(d));
    if(n<0)
        nn=-n;
    else
        nn=n;
    if(m<0)
        mm=-m;
    else
        mm=m;
    imp=a*2;
    if(imp<0)
        imp=-imp;
    an=imp/cmmdc(nn , imp);
    am=imp/cmmdc(mm , imp);
    n=-n;
    m=-m;
    imp=2*a;
    aux=a;
    if(a<0)
        a=-a;
    for(i=1;i*i<=a;i++)
        if(a%i==0)
        {
            z=a/i;
            if(i%an==0&&z%am==0)
            {
                v.push_back(make_pair(i, n*i/imp));
                v.push_back(make_pair(-i, -n*i/imp));
            }
            if(i%am==0&&m!=n&&z%an==0)
            {
                v.push_back(make_pair(i, m*i/imp));
                v.push_back(make_pair(-i, -m*i/imp));
            }
            if(i!=z)
            {
                if(z%an==0&&i%am==0)
                {
                    v.push_back(make_pair(z, n*z/imp));
                    v.push_back(make_pair(-z, -n*z/imp));
                }
                if(z%am==0&&m!=n&&i%an==0)
                {
                    v.push_back(make_pair(z, m*z/imp));
                    v.push_back(make_pair(-z, -m*z/imp));
                }
            }
        }
    a=aux;
    if(k==0||k>v.size())
    {
        fout<<-1;
        return 0;
    }
    sort(v.begin(), v.end());
    p=v[k-1].first;
    q=v[k-1].second;
    afis(p, q);
    if(q*imp/p==n)
        el=m;
    else
        el=n;
    p=a/p;
    q=el*p/imp;
    afis(p, q);
    fin.close();
    fout.close();
    return 0;
}