Cod sursa(job #110121)

Utilizator paliucaJean Luca Paliuca paliuca Data 25 noiembrie 2007 18:11:00
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 11.54 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)",a,x1,x2);
    
    
    
    
    sir[0] = 1;
    sir[1] = 1;
    
    
    long aux = a;
    for (i = 2 ; i <= a/2 ; i++)
    {
        if (a%i==0)
        {
                   sir[0]++;
                   sir[sir[0]] = i;
        }
    }
    sir[0]++;
    sir[sir[0]] = a;
    if (sir[0] * 4 <= k)
    {
               printf("-1");
               return 0;
    }
    while(k>0)
    {
            
            for (i = sir[0] ; i >= 1 ; i--)
            {
                if (mare(-sir[i],-sir[i]*x1,-sir[i],-sir[i]*x2)==1)
                {
                                        if (-(a/sir[i])*x1 > -(a/sir[i])*x2)
                                        {
                                   //    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;
                                        }
                                   //     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;
                                        }
                                        }
                                      
                                        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;
                                             }
                                        }
                                        
                                        
                }
            }
            
        break;
    }
            
    printf("-1");        
    
    return 0;
}