Cod sursa(job #114554)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 14 decembrie 2007 20:34:03
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 6.99 kb
#include <stdio.h>
#include <math.h>

long a,b,c,k,r,delta,l1,l2;
long d1[35000],d2[35000];
long i,sol=0;
double daux,aux,x1,x2,q11,q12,q21,q22;

int  main(){
     freopen("ecuatie.in","r",stdin);
     freopen("ecuatie.out","w",stdout);
     
     scanf ("%ld %ld %ld %ld",&a,&b,&c,&k);
     delta=b*b-4*a*c;
     r=sqrt(delta);
     if (r*r!=delta){printf("-1\n");return 0;}
     x1=(double)(-b-r)/(2*a);
     x2=(double)(-b+r)/(2*a);
     
     l1=0;
     for (i=1;i<sqrt(a);i++)
         if (!(a%i)){
            d1[++l1]=i;
            d2[++l2]=a/i;
         }
     r=sqrt(a);
     if (r*r==a)d1[++l1]=r;
     
     //for (i=1;i<=l1;i++)printf("%ld ",d1[i]);
     //for (i=l2;i>0;i--)printf("%ld ",d2[i]);
     
     for (i=1;i<=l2;i++){
         d2[i]=-d2[i];
         
         q11=-x1*d2[i];
         q12=-x2*d2[i];
         q21=-x2*(a/d2[i]);
         q22=-x1*(a/d2[i]);
         if (q11>q12){
            aux=q11;q11=q12;q12=aux;
            aux=q21;q21=q22;q22=aux;
         }
         sol++;
     if (sol==k){
                     
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q11<0)printf("%ld",(long)q11);
         else printf("+%ld",(long)q11);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q21<0)printf("%ld",(long)q21);
         else printf("+%ld",(long)q21);
         printf(")\n");
         return 0;
     }
     sol++;
     if (sol==k){
         //acelasi p1 dar q12 diferit
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q12<0)printf("%ld",(long)q12);
         else printf("+%ld",(long)q12);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q22<0)printf("%ld",(long)q22);
         else printf("+%ld",(long)q22);
         printf(")\n");
         return 0;
     }
         d2[i]=-d2[i];
     }
     //al doilea vect de divizori
     for (i=l1;i>0;i--){
         daux=d2[i];
         d2[i]=-d1[i];
         
         q11=-x1*d2[i];
         q12=-x2*d2[i];
         q21=-x2*(a/d2[i]);
         q22=-x1*(a/d2[i]);
         if (q11>q12){
            aux=q11;q11=q12;q12=aux;
            aux=q21;q21=q22;q22=aux;
         }
     sol++;
     if (sol==k){
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q11<0)printf("%ld",(long)q11);
         else printf("+%ld",(long)q11);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q21<0)printf("%ld",(long)q21);
         else printf("+%ld",(long)q21);
         printf(")\n");
         return 0;
     }
     sol++;
     if (sol==k){
         //acelasi p1 dar q12 diferit
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q12<0)printf("%ld",(long)q12);
         else printf("+%ld",(long)q12);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q22<0)printf("%ld",(long)q22);
         else printf("+%ld",(long)q22);
         printf(")\n");
         return 0;
     }
         d2[i]=daux;
     }
     
     //////////////////////
     //    pentru p1 pozitiv
     //////////////////////////
     
     for (i=1;i<=l1;i++){
         daux=d2[i];
         d2[i]=d1[i];
         
         q11=-x1*d2[i];
         q12=-x2*d2[i];
         q21=-x2*(a/d2[i]);
         q22=-x1*(a/d2[i]);
         if (q11>q12){
            aux=q11;q11=q12;q12=aux;
            aux=q21;q21=q22;q22=aux;
         }
     sol++;
     if (sol==k){
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q11<0)printf("%ld",(long)q11);
         else printf("+%ld",(long)q11);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q21<0)printf("%ld",(long)q21);
         else printf("+%ld",(long)q21);
         printf(")\n");
         return 0;
     }
     sol++;
     if (sol==k){
         //acelasi p1 dar q12 diferit
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q12<0)printf("%ld",(long)q12);
         else printf("+%ld",(long)q12);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q22<0)printf("%ld",(long)q22);
         else printf("+%ld",(long)q22);
         printf(")\n");
         return 0;
     }
         d2[i]=daux;
     }     
     //al doilea vect de div
     
     for (i=l2;i>0;i--){
         //d2[i]=-d2[i];
         
         q11=-x1*d2[i];
         q12=-x2*d2[i];
         q21=-x2*(a/d2[i]);
         q22=-x1*(a/d2[i]);
         if (q11>q12){
            aux=q11;q11=q12;q12=aux;
            aux=q21;q21=q22;q22=aux;
         }
     sol++;
     if (sol==k){
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q11<0)printf("%ld",(long)q11);
         else printf("+%ld",(long)q11);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q21<0)printf("%ld",(long)q21);
         else printf("+%ld",(long)q21);
         printf(")\n");
         return 0;
     }
     sol++;
     if (sol==k){
         //acelasi p1 dar q12 diferit
         if (d2[i]==1)printf("(x");
         else
             if (d2[i]==-1)printf("(-x");
             else printf("(%ldx",d2[i]);
         if (q12<0)printf("%ld",(long)q12);
         else printf("+%ld",(long)q12);
         printf(")");
         //a doua parte
         if (a/d2[i]==1)printf("(x");
         else
             if (a/d2[i]==-1)printf("(-x");
             else printf("(%ldx",a/d2[i]);
         if (q22<0)printf("%ld",(long)q22);
         else printf("+%ld",(long)q22);
         printf(")\n");
         return 0;
     }
         //d2[i]=-d2[i];
     }     
     printf("-1\n");
          
     return 0;
}