Cod sursa(job #110143)

Utilizator paliucaJean Luca Paliuca paliuca Data 25 noiembrie 2007 18:38:34
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 11.51 kb
#include<stdio.h>
#include<math.h>

long a , b , c , k;
long delta;
long x1 , x2;
long sir[5001] , i;
long mare(long p1 , long q1 , long p2 , long q2)
{
     if (p1 < p2)
        return 1;
     if (p1 == p2 && q1 <= q2)
        return 1;
     return 2;
}

void afis(long a , long a1 , long b , long b1)
{
     
     printf("(");
     if (a == 1)
        printf("x");
     else
     if (a==-1)
        printf("-x");
     else
     printf("%ldx",a);
     
     if (a1 < 0)
        printf("+%ld",-a1);
     else
     printf("-%ld",a1);
     printf(")");
     printf("(");
     if (b==1)
              printf("x");
     else
     if (b==-1)
               printf("-x");
     else
     {
         printf("%ldx",b);
     }
     if (b1 < 0)
     {
            printf("+%ld",-b1);
     }
     else
            printf("-%ld",b1);
     printf(")");
}
     

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;
    
    if (delta < 0)
    {
              printf("-1\n");
              return 0;
    }           
    
    x1 = (- b - sqrt(delta))/(2*a);
    x2 = (- b + sqrt(delta))/(2*a);
    
    
    
    
    
 //   printf("%ld(x-%ld)(x-%ld)\n",a,x1,x2);
    
    
    
    
   
    
    
    long aux = a;
    if (aux < 0) aux*=-1;
    for (i = 1 ; i <= aux/2 ; i++)
    {
        if (aux%i==0)
        {
                   sir[0]++;
                   sir[sir[0]] = i;
        }
    }
    sir[0]++;
    sir[sir[0]] = aux;

  // for (i = 1 ; i <= sir[0] ; i++)
 //      printf("%ld ",sir[i]);
//   printf("\n");
  a=aux;
    for (i = 1 ; i <= sir[0] ; i++)
            {
                if (mare(-sir[i],-sir[i]*x1,-sir[i],-sir[i]*x2)==1)
                {
                                        if (-(aux/sir[i])*x1 > -(aux/sir[i])*x2)
                                        {
                          //             printf("(%ldx-%ld)(%ldx-%ld)\n" ,-(aux/sir[i]),-(aux/sir[i])*x1,-(sir[i]),-(sir[i])*x2 );
                                        k--;
                                       
                                        if (k==0)
                                        {
                                                 afis(-(aux/sir[i]),-(aux/sir[i])*x2,-(sir[i]),-(sir[i])*x2);
                                                 return 0;
                                        }
                         //               printf("(%ldx-%ld)(%ldx-%ld)\n" ,-(aux/sir[i]),-(aux/sir[i])*x2,-sir[i],-sir[i]*x1 );
                                        k--;
                                        if (k==0)
                                        {
                                                 afis(-(aux/sir[i]),-(aux/sir[i])*x2,-sir[i],-sir[i]*x1);
                                                 return 0;
                                        }
                                        }
                                      
                                        else
                                        {
                         //                    printf("(%ldx-%ld)(%ldx-%ld)\n" ,-(a/sir[i]),-(a/sir[i])*x2,-sir[i],-sir[i]*x1 );
                                             k--;
                                             if (k==0)
                                             {
                                                      afis(-(a/sir[i]),-(a/sir[i])*x2,-sir[i],-sir[i]*x1);
                                                      return 0;
                                             }
                          //                   printf("(%ldx-%ld)(%ldx-%ld)\n" ,-(a/sir[i]),-(a/sir[i])*x1,-(sir[i]),-(sir[i])*x2 );
                                             k--;
                                             if (k==0)
                                             {
                                                      afis(-(a/sir[i]),-(a/sir[i])*x1,-(sir[i]),-(sir[i])*x2);
                                                      return 0;
                                             }
                                      
                                            
                                        }
                }
              
                else
                {
                                        if (-sir[i]*x1 > -sir[i]*x2)
                                        {
                          //              printf("(%ldx-%ld)(%ldx-%ld)\n" ,-sir[i],-sir[i]*x1,-(a/sir[i]),-(a/sir[i])*x2 );
                                        k--;
                                        if (k==0)
                                        {
                                        afis(-sir[i],-sir[i]*x1,-(a/sir[i]),-(a/sir[i])*x2);
                                        return 0;
                                        }
                          //              printf("(%ldx-%ld)(%ldx-%ld)\n" ,-sir[i],-sir[i]*x2 ,-a/sir[i],-(a/sir[i])*x1);
                                        k--;
                                        if (k==0)
                                        {
                                        afis(-sir[i],-sir[i]*x2 ,-a/sir[i],-(a/sir[i])*x1);
                                        return 0;
                                        }
                                        }
                                        else
                                        {
                          //                  printf("(%ldx-%ld)(%ldx-%ld)\n" ,-sir[i],-sir[i]*x2 ,-a/sir[i],-(a/sir[i])*x1);
                                            k--;
                                            if (k==0)
                                             {
                                             afis(-sir[i],-sir[i]*x2 ,-a/sir[i],-(a/sir[i])*x1);
                                             return 0;
                                             }
                         //                   printf("(%ldx-%ld)(%ldx-%ld)\n" ,-sir[i],-sir[i]*x1,-(a/sir[i]),-(a/sir[i])*x2 );
                                            k--;
                                            if (k==0)
                                             {
                                             afis(-sir[i],-sir[i]*x1,-(a/sir[i]),-(a/sir[i])*x2 );
                                             return 0;
                                             }
                                            
                                        }
                                    
                }
            }
            for (i =1 ; i <= sir[0] ; i++)
            {
                if (mare(sir[i],sir[i]*x1,(a/sir[i]),(a/sir[i])*x2)==1)
                {
                                        if (sir[i]*x1 >  sir[i]*x2)
                                        {                              
                               //         printf("(%ldx-%ld)(%ldx-%ld)\n" ,sir[i],sir[i]*x1,(a/sir[i]),(a/sir[i])*x2 );
                                        k--;
                                          if (k==0)
                                             {
                                             afis(sir[i],sir[i]*x1,(a/sir[i]),(a/sir[i])*x2 );
                                             return 0;
                                             }
                              //          printf("(%ldx-%ld)(%ldx-%ld)\n" ,sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                        k--;
                                          if (k==0)
                                             {
                                             afis(sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                             return 0;
                                             }
                                        }
                                        else
                                        {
                             //                 printf("(%ldx-%ld)(%ldx-%ld)\n" ,sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                             k--;
                                               if (k==0)
                                             {
                                             afis(sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                             return 0;
                                             }
                             //                printf("(%ldx-%ld)(%ldx-%ld)\n" ,sir[i],sir[i]*x1,(a/sir[i]),(a/sir[i])*x2 );
                                             k--;
                                               if (k==0)
                                             {
                                             afis(sir[i],sir[i]*x1,(a/sir[i]),(a/sir[i])*x2 );
                                             return 0;
                                             }
                                          
                                        }
                                            
                }
            
                else
                {
                                        if (sir[i]*x2 > sir[i]*x1)
                                        {
                              //          printf("(%ldx-%ld)(%ldx-%ld)\n" ,sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                        k--;    
                                          if (k==0)
                                             {
                                             afis(sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1  );
                                             return 0;
                                             }                                    
                              //          printf("(%ldx-%ld)(%ldx-%ld)\n" ,(sir[i]),(sir[i])*x1,(a/sir[i]),(a/sir[i])*x2 );
                                        k--;
                                          if (k==0)
                                             {
                                             afis((sir[i]),(sir[i])*x1,(a/sir[i]),(a/sir[i])*x2  );
                                             return 0;
                                             }
                                        }
                                        else
                                        {
                                 //       printf("(%ldx-%ld)(%ldx-%ld)\n" ,(sir[i]),(sir[i])*x1,(a/sir[i]),(a/sir[i])*x2 );
                                        k--;
                                          if (k==0)
                                             {
                                             afis((sir[i]),(sir[i])*x1,(a/sir[i]),(a/sir[i])*x2  );
                                             return 0;
                                             }
                             //           printf("(%ldx-%ld)(%ldx-%ld)\n" ,sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                        k--;
                                          if (k==0)
                                             {
                                             afis(sir[i],sir[i]*x2,(a/sir[i]),(a/sir[i])*x1 );
                                             return 0;
                                             }
                                        }
                                        
                                        
                }
            }
            
 
            
    printf("-1");        
    
    return 0;
}