Cod sursa(job #998248)

Utilizator geniucosOncescu Costin geniucos Data 16 septembrie 2013 16:55:02
Problema Ecuatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include<cmath>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int Nr,nr,i,A,B,C,auxC,Poz,sol[10];
vector < int > v;
vector < int >::iterator it;
void solveeq2(long long A,long long B,long long C)
{
    long long dint,X1,X2;
    double x1,x2,delta=(double)1LL*B*B-1LL*4*A*C;
    nr=0;
    if(delta<0) return ;
    delta=pow(delta,0.5);
    dint=(long long)delta;
    if((long long)1LL*dint*dint!=(long long)1LL*B*B-1LL*4*A*C) return ;
    x1=(double)((double)-B-delta)/(2*A);X1=(long long)x1;
    x2=(double)((double)-B+delta)/(2*A);X2=(long long)x2;
    if(1LL*X1*X1*A+X1*B+C==0&&auxC%X1==0){nr++;sol[nr]=X1;}
    if(1LL*X2*X2*A+X2*B+C==0&&auxC%X2==0){nr++;sol[nr]=X2;}
}
void afispar(int P1,int Q1)
{
    printf("(");
    if(P1==-1) printf("-x");
    else
    if(P1==1) printf("x");
    else printf("%dx",P1);
    if(Q1<0) printf("%d",Q1);
    else printf("+%d",Q1);
    printf(")");
}
void afis(int P1,int Q1)
{
    int P2=A/P1,Q2=C/Q1;
    afispar(P1,Q1);
    afispar(P2,Q2);
}
int main()
{
freopen("ecuatie.in","r",stdin);
freopen("ecuatie.out","w",stdout);
scanf("%d",&A);
scanf("%d",&B);
scanf("%d",&C);
auxC=C;
scanf("%d",&Poz);
for(i=1;i*i<A;i++)
    if(A%i==0)
    {
        v.push_back(i);
        v.push_back(A/i);
        v.push_back(-i);
        v.push_back(-A/i);
    }
if(i*i==A){v.push_back(i);v.push_back(-i);}
sort(v.begin(),v.end());
Nr=0;
for(it=v.begin();it!=v.end();it++)
{
    solveeq2(A/ *it,-B,(long long)*it*C);
    Nr+=nr;
    if(Nr>=Poz)
    {
        sort(sol+1,sol+nr+1);
        if(Nr==Poz) afis(*it,sol[2]);
        else afis(*it,sol[1]);
        printf("\n");
        return 0;
    }
}
printf("-1\n");
return 0;
}