Cod sursa(job #1846765)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 14 ianuarie 2017 00:22:21
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#define nmax 10000
using namespace std;
ifstream f("ecuatie.in");
ofstream g("ecuatie.out");
struct solut{int p1,p2,q1,q2;};
long long rd;
solut v[nmax];
int n,sol;
int a,b,c,d,t,p,r[nmax];

int cmmdc(int a,int b)
{
    if (b==0)
        return a;
    return cmmdc(b,a%b);
}
bool comp(const solut &a,const solut &b)
{
    if (a.p1!=b.p1)
        return a.p1<b.p1;
    return a.q1<b.q1;
}
void adding(int p1,int p2)
{
    int i,q1,q2;
    for (i=1;i<=n;i++) {
        q1=r[i];
        q2=c/r[i];
        if (p1*q2+p2*q1==b) {
            sol++;
            v[sol].p1=p1;
            v[sol].p2=p2;
            v[sol].q1=q1;
            v[sol].q2=q2;
        }
    }
}
void write(int p,int q)
{
    g<<'(';
    if (p==-1)
        g<<'-';
    if (p!=1&p!=-1)
        g<<p;
    g<<'x';
    if (q>=0)
        g<<'+'<<q;
    else
        g<<'-'<<-q;
    g<<')';
}
int main()
{
    f>>a>>b>>c>>p;

    d=b*b-4*a*c;
    if (d>=0)
        rd=sqrt(double(d));
    if (d<0||(rd*rd!=d)) {
        g<<-1;
        return 0;
    }
    int p1,p2,i=max(c,-c);
    for (p1=1;p1*p1<=i;p1++)
        if (c%p1==0) {
            r[++n]=p1;
            r[++n]=-p1;
            if (p1!=c/p1) {
                r[++n]=c/p1;
                r[++n]=-c/p1;
            }
        }
    for (p1=1;p1*p1<=a;p1++)
        if (a%p1==0) {
            p2=a/p1;
            adding(p1,p2);
            adding(-p1,-p2);
            if (p1!=p2) {
                adding(p2,p1);
                adding(-p2,-p1);
            }
        }
    sort(v+1,v+sol+1,comp);
    if (p>sol) {
        g<<-1;
        return 0;
    }
    write(v[p].p1,v[p].q1);
    write(v[p].p2,v[p].q2);
    return 0;
}