Cod sursa(job #1965334)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 14 aprilie 2017 12:11:39
Problema Ecuatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;
int da[60001],dc[60001];
int modul (int x){
    if (x<0)
        return -x;
    return x;
}
int main()
{
    FILE *fin=fopen ("ecuatie.in","r");
    FILE *fout=fopen ("ecuatie.out","w");
    int a,b,c,k,diva,divc,d,p1,p2,q1,q2,i,j,sol=0,x;
    fscanf (fin,"%d%d%d%d",&a,&b,&c,&k);
    diva=divc=0;
    x=modul(a);
    for (d=1;d*d<=x;d++){
        if (a%d==0){
            da[++diva]=d;
            if (d!=a/d)
                da[++diva]=a/d;
        }
    }
    for (i=1;i<=diva;i++)
        da[diva+i]=-da[i];
    x=modul(c);
    for (d=1;d*d<=x;d++){
        if (c%d==0){
            dc[++divc]=d;
            if (d!=c/d)
                dc[++divc]=c/d;
        }
    }
    for (i=1;i<=divc;i++)
        dc[divc+i]=-dc[i];
    diva*=2;
    divc*=2;
    sort (da+1,da+diva+1);
    sort (dc+1,dc+divc+1);
    for (i=1;i<=diva;i++){
        p1=da[i];
        p2=a/p1;
        //if (p1==-4 && p2==-1)
          //  printf ("a");
        // p1 e cel mai mic asa ca le voi afla chiar in ordine fara sa am nevoie de vector
        for (j=1;j<=divc;j++){
            q1=dc[j];
            q2=c/q1;
            if (p2*q1+q2*p1==b){
                sol++;
                //printf ("%d %d %d %d\n",p1,p2,q1,q2);
                if (sol==k){
                    fprintf (fout,"(");
                    if (p1==-1)
                        fprintf (fout,"-x");
                    else if (p1==1)
                        fprintf (fout,"x");
                    else fprintf (fout,"%dx",p1);
                    if (q1<0)
                        fprintf (fout,"%d",q1);
                    else fprintf (fout,"+%d",q1);
                    fprintf (fout,")");
                    fprintf (fout,"(");
                    if (p2==-1)
                        fprintf (fout,"-x");
                    else if (p2==1)
                        fprintf (fout,"x");
                    else fprintf (fout,"%dx",p2);
                    if (q2<0)
                        fprintf (fout,"%d",q2);
                    else fprintf (fout,"+%d",q2);
                    fprintf (fout,")");
                    return 0;
                }
            }
        }
    }
    fprintf (fout,"-1");
    return 0;
}