Cod sursa(job #399940)

Utilizator nandoLicker Nandor nando Data 21 februarie 2010 10:45:29
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>

#define MAX 1000000

int sol[MAX][4],sol2[MAX][4],ns=0,ns2=0;
int a,b,c,k;
float x1,x2;
long long d,i;

void printeq(int eq[]){
	printf("(");
	if(eq[0]!=1&&eq[0]!=-1){
		printf("%d",eq[0]);
	}else if(eq[0]==-1){
		printf("-");
	}
	printf("x%c%u)(",(eq[1]>0)?'+':'-',(eq[1]>0)?eq[1]:-eq[1]);
	if(eq[2]!=1&&eq[2]!=-1){
		printf("%d",eq[2]);
	}else if(eq[2]==-1){
		printf("-");
	}
	printf("x%c%u)\n",(eq[3]>0)?'+':'-',(eq[3]>0)?eq[3]:-eq[3]);
}

bool isInt(float f){
	return (f-(int)f)==0;
}
void addSol(int s){
	if(isInt(s*x1)&&isInt(x2*(a/s))){
		sol[ns][0]=s;
		sol[ns][1]=-x1*s;
		sol[ns][2]=a/s;
		sol[ns][3]=-x2*(a/s);
		ns++;
	}
	if(isInt(x2*s)&&isInt(x1*(a/s))){
		sol[ns][0]=s;
		sol[ns][1]=-x2*s;
		sol[ns][2]=a/s;
		sol[ns][3]=-x1*(a/s);
		ns++;
	}
}
int comp(const void* p1,const void* p2){
	int *v1=(int*)p1,*v2=(int*)p2;
	if(v1[0]-v2[0]==0){
		return v1[1]-v2[1];
	}else{
		return v1[0]-v2[0];
	}
}
int main(){

	FILE* fin=fopen("ecuatie.in","r");
	freopen("ecuatie.out","wt",stdout);
	
	fscanf(fin,"%d %d %d %d",&a,&b,&c,&k);
	d=b*b-4*a*c;
	i=(int)sqrt(abs(d));
	if(i*i==d){
		x1=float(-b-i)/(2*a);
		x2=float(-b+i)/(2*a);

		a=abs(a);
		int l=sqrt(a);

		for(int i=1;i<=l;i++){
			if(a%i==0){
				addSol(i),addSol(-i);
				addSol(a/i),addSol(-a/i);
			}
		}
		qsort(sol,ns,sizeof(int)*4,comp);
		for(int i=0;i<ns;i++){
			memcpy(sol2[ns2++],sol[i],16);
		//	printeq(sol2[ns2-1]);
			while(!memcmp(sol[i],sol[i+1],16)&&i<ns-1){
				i++;
			}
		}
		printeq(sol2[k-1]);
	}else{
		printf("-1");
	}
	return 0;
}