Cod sursa(job #325179)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 19 iunie 2009 13:21:48
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <stdio.h>
#include <math.h>
struct ec{
	long p1,p2;
   float q1,q2;
};

long A,B,C,P1,P2;
float x1,x2,Q1,Q2;
long d,k,z,ok,i,nr;
ec a[1000000];

int ecuatie(long A,long B,long C){
	long delta;
   delta = B*B -4*A*C;
   if( sqrt(delta) * sqrt(delta) - delta >0) return -1;
   x1 = (-B + sqrt(delta) ) / (2*A);
   x2 = (-B - sqrt(delta) ) / (2*A);
   return 1;
}

void vezid(long d){
	P1 = d;
   Q1 = (-x1)*d ;
   P2 = A/d;
   Q2 = (-x2)*(A/d);
   if( floor(Q1) == Q1 && floor(Q2) == Q2){// dc sunt intregi
   	a[++z].p1=P1; a[z].p2=P2;
      a[z].q1=Q1; a[z].q2=Q2;
   }

	P1 = d;
   Q1 = -x2 *d;
   P2 = A/d;
   Q2 = -x1*(A/d);
   if( floor(Q1) == Q1 && floor(Q2) == Q2){// dc sunt intregi
   	a[++z].p1=P1; a[z].p2=P2;
      a[z].q1=Q1; a[z].q2=Q2;
   }
}

long abs(long x){
              if(x>0) return x;
              else return -x;
}

void work(){
	for(d=1; d<= sqrt(abs(A));++d){
   	vezid(d);
      vezid(-d);
      vezid(A/d);
      vezid(-A/d);
   }
}

void sort(long l,long r){
	long i,j,xp1,xq1,y;
   float fy;
   i=l; j=r; xp1=a[l+(r-l)/2].p1; xq1=a[l+(r-l)/2].q1;
   do {
   	while(a[i].p1 < xp1 || (a[i].p1==xp1 && a[i].q1<xq1)) ++i;
      while( xp1 < a[j].p1 ||(a[j].p1==xp1 && xq1<a[j].q1)) --j;
      if(i<=j){
          y=a[i].p1; a[i].p1=a[j].p1; a[j].p1=y;
          y=a[i].p2; a[i].p2=a[j].p2; a[j].p2=y;
			 fy=a[i].q1; a[i].q1=a[j].q1; a[j].q1=fy;
			 fy=a[i].q2; a[i].q2=a[j].q2; a[j].q2=fy;
          ++i; --j;
      }
   } while(i<=j);
   if(i<r) sort(i,r);
   if(l<j) sort(l,j);
}

void scrie(long p1, float q1){
		printf("(");
      if(p1==1);
      else if(p1==-1)printf("-");
      else printf("%d",p1);
      printf("x");
      if(q1<0)printf("%.0f",q1);
      else printf("+%.0f",q1);
      printf(")");
}

int main(){
	freopen("ecuatie.in","r",stdin);
   freopen("ecuatie.out","w",stdout);
   scanf("%ld%ld%ld%ld",&A,&B,&C,&k);
   ok=ecuatie(A,B,C);
   if(ok==-1) printf("-1\n");
   else work();

   sort(1,z);

   i=2; nr=1;
   while(i<=z && nr<k){
   	if(a[i].p1==a[i-1].p1 && a[i].p2==a[i-1].p2 && a[i].q1==a[i-1].q1&&
         a[i].q2==a[i-1].q2) ;
      else nr++;
      i++;
   }
   i--;
   if(nr==k && i<=z){
      scrie(a[i].p1,a[i].q1);
      scrie(a[i].p2,a[i].q2);
      printf("\n");
   }
   fclose(stdin); fclose(stdout);
   return 0;
}