Cod sursa(job #376125)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 20 decembrie 2009 19:32:34
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.73 kb
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

long long a,b,c,k,i,j,n,nr,delt;
float x,y,z;

struct nod
{ int p1,p2,q1,q2;
}sir[50000];

void findq(int p1,int p2)
{ 
  long double q11,q12,q21,q22;
  long long x1=(long long)(x);//printf("%d\n",x1);
  {  q11=(b+x1)/(2*p2); //printf("%f\n",q11);
                                        if(int(q11)==q11) {  q12=c/q11;//printf("%f \n\n",q12);
                                                            if(int(q12)==q12&&q11*q12==c&&p1*q12+p2*q11==b)
																			  { sir[++nr].p1=p1;
										                                        sir[nr].p2=p2;
                                                                                sir[nr].q1=int(q11);
                                                                                sir[nr].q2=int(q12);
																				sir[++nr].p1=p2;
										                                        sir[nr].p2=p1;
                                                                                sir[nr].q1=int(q12);
                                                                                sir[nr].q2=int(q11);
															                  }
										                  }
										 q21=(b-x1)/(2*p2);
                                        if(int(q21)==q21) {  q22=c/q21;
                                                            if(int(q22)==q22&&q21*q22==c&&p1*q22+p2*q21==b) 
															                  { sir[++nr].p1=p1;
										                                        sir[nr].p2=p2;
                                                                                sir[nr].q1=int(q21);
                                                                                sir[nr].q2=int(q22);
																				sir[++nr].p1=p2;
										                                        sir[nr].p2=p1;
                                                                                sir[nr].q1=int(q22);
                                                                                sir[nr].q2=int(q21); 
															                  }
										                  }
                                     }
}
    																				
bool comp(nod a,nod b)
{ 
	if(a.p1!=b.p1) return a.p1<b.p1;
	return a.q1<b.q1;
}	

void afisp(int x)
{ if(x!=1){ if(x<0) { printf("-");
                      x=-x;
                    }
			if(x!=1) printf("%d",x);
          }
} 

void afisq(int x)
{   if(x>0) printf("+");
	if(x!=1){ if(x<0) { printf("-");
                      x=-x;
                    }
             
			if(x!=1) printf("%d",x);
          }
}
					  
 
  

int main()
{
	freopen("ecuatie.in","r",stdin);
	freopen("ecuatie.out","w",stdout);
	
	scanf("%lld %lld %lld %lld",&a,&b,&c,&k);
	    delt=b*b-4*a*c;
        x=sqrt(delt);
        int x1=int(x);
	if(x1*x1!=delt) { printf("-1\n");
	                  fclose(stdin);
	                  fclose(stdout);
                      return 0;
	                } 					  
	
	int n=int(sqrt(a));
	
	for(i=1;i<=n;++i) if(a%i==0) { findq(i,a/i);
	                               findq(-i,-a/i);
	                             }

	sort(sir+1,sir+nr+1,comp);
	int r=0;
	for(i=1;i<=nr;++i) if(sir[i].p1!=sir[i+1].p1 || sir[i].p2!=sir[i+1].p2 || sir[i].q1!=sir[i+1].q1 || sir[i].q2!=sir[i+1].q2) 
		{ sir[++r]=sir[i];
	    // printf("%d %d %d %d\n",sir[r].p1,sir[r].q1,sir[r].p2,sir[r].q2);
		}	
	if(k>r)	{ printf("-1\n");
	          fclose(stdin);
	          fclose(stdout);
              return 0;
	        }
	
	printf("(");
	afisp(sir[k].p1);
	printf("x");
	afisq(sir[k].q1);
	printf(")(");
	afisp(sir[k].p2);
    printf("x");
    afisq(sir[k].q2);
    printf(")\n"); 	
	
	
    fclose(stdin);
	fclose(stdout);
	
	return 0;
}