Cod sursa(job #2233616)

Utilizator GiihuoTihufiNeacsu Stefan GiihuoTihufi Data 23 august 2018 18:54:03
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("ecuatie.in");
ofstream g("ecuatie.out");

bool isInt(double x)
{
    return x==floor(x);
}

bool isSolution(int d,double x1,double x2,int A)
{
    return isInt((double)x1*d) && isInt((double)x2*(A/d));
}

string str(int x,bool ignore1=0,bool addplus=0)
{
    if(ignore1)
        if(x==1) return "";
        else if(x==-1) return "-";
    string s=to_string(x);
    if(addplus && x>=0) return "+"+s;
    else return s;
}

string translate(int p1,int q1,int p2,int q2)
{
    return "("+str(p1,1)+"x"+str(q1,0,1)+")("+str(p2,1)+"x"+str(q2,0,1)+")";
}

int main()
{
    int A,B,C,K;
    f>>A>>B>>C>>K;
    int delta=B*B-4*A*C;
    if(delta<0) { g<<-1; return 0;}
    int sqd=(int)sqrt(delta);
    if(sqd*sqd!=delta) {g<<-1; return 0;}
    double x1,x2;
    x1=(-B-sqd)/(2*A), x2=(-B+sqd)/(2*A);

    vector<pair<pair<int,int>,pair<int,int>>> R;
    #define P1 first.first
    #define Q1 first.second
    #define P2 second.first
    #define Q2 second.second

    auto genSol=[&x1,&x2,&A,&R](int i)
    {
        if(isSolution( i,x1,x2,A)) R.push_back({{i,-x1*i},{A/i,-x2*(A/i)}});
        if(isSolution( i,x2,x1,A)) R.push_back({{i,-x2*i},{A/i,-x1*(A/i)}});
    };
    int sqA=sqrt(A);
    for(int i=1;i<=sqA;i++)
        if(A%i==0)
            genSol(i),genSol(-i),genSol(A/i),genSol(-A/i);
    sort(R.begin(),R.end());
    vector<int> eraser;
    for(int i=1;i<R.size();i++)
        if(R[i]==R[i-1]) eraser.push_back(i);
    int index=0;
    for(auto e:eraser)
    {
        R.erase(R.begin()+e-index);
        index++;
    }
    if(K>R.size()) {g<<-1; return 0;}
    else g<<translate(R[K-1].P1,R[K-1].Q1,R[K-1].P2,R[K-1].Q2);

    return 0;
}