Cod sursa(job #397742)

Utilizator nandoLicker Nandor nando Data 17 februarie 2010 13:34:47
Problema Multimi2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>

#define MAX 1000000

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

void printeq(FILE* fout,int eq[]){
	fputc('(',fout);
	if(eq[0]!=1&&eq[0]!=-1){
		fprintf(fout,"%d",eq[0]);
	}else if(eq[0]==-1){
		fprintf(fout,"-");
	}
	fprintf(fout,"x%c%u)(",(eq[1]>0)?'+':'-',(eq[1]>0)?eq[1]:-eq[1]);
	if(eq[2]!=1&&eq[2]!=-1){
		fprintf(fout,"%d",eq[2]);
	}else if(eq[2]==-1){
		fprintf(fout,"-");
	}
	fprintf(fout,"x%c%u)\n",(eq[3]>0)?'+':'-',(eq[3]>0)?eq[3]:-eq[3]);
}
void addSol(int k){
	sol[ns][0]=k;
	sol[ns][1]=-x1*k;
	sol[ns][2]=a/k;
	sol[ns][3]=-x2*a/k;
	ns++;
	sol[ns][0]=k;
	sol[ns][1]=-x2*k;
	sol[ns][2]=a/k;
	sol[ns][3]=-x1*a/k;
	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");
	FILE* fout=fopen("ecuatie.out","w");

	fscanf(fin,"%d %d %d %d",&a,&b,&c,&k);

	d=b*b-4*a*c;

	if(d>0&&(i=sqrt(d))*i==d){
		x1=(-b-i)/(2*a),x2=(-b+i)/(2*a);
		for(int i=1;i<=abs((a>>1));i++){
			if(a%i==0){
				addSol(i),addSol(-i);
			}
		}
		addSol(a),addSol(-a);
		qsort(sol,ns,sizeof(int)*4,comp);
		if(k<=ns){
			printeq(fout,sol[k-1]);
		}else{
			fprintf(fout,"-1");
		}
	}else{
		fprintf(fout,"-1");
	}
	fclose(fout);
	return 0;
}