Cod sursa(job #109766)

Utilizator hadesgamesTache Alexandru hadesgames Data 25 noiembrie 2007 12:39:56
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 5-8 Marime 2.26 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 int compare( const void* a, const void* b ) {
   int* aa = (int*) a;
   int* bb = (int*) b;
   if( *aa < *bb ) return -1;
   else if( *aa == *bb ) return 0;
   else return 1;
 }    
int main()
{
	FILE *in,*out;
	int d[100000],a,b,c,k,delta,x,nr,i,p1,q2,p2,q1,aux1,aux2;
	in=fopen("ecuatie.in","r");
	out=fopen("ecuatie.out","w");
	fscanf(in,"%d%d%d%d",&a,&b,&c,&k);
	delta=b*b-4*a*c;
	if (delta<0||floor(sqrt(delta))*floor(sqrt(delta))!=delta)
	{
		fprintf(out,"-1\n");
		fclose(in);
		fclose(out);
		return 0;
	}
	nr=1;
	d[0]=-a-1;
	d[1]=a;
	for (i=1;i<=a/2;i++)
		if (a%i==0)
		{
			nr++;
			d[nr]=i;
		}
	x=nr;
	for (i=1;i<=x;i++)
	{
		nr++;
		d[nr]=-d[i];
	}
	qsort(d,nr+1,sizeof(d[1]),compare);
	if (delta==0)
	{
		if (k>nr)
		{
			fprintf(out,"-1\n");
			fclose(in);
			fclose(out);
			return 0;
		}
		p1=d[k];
		p2=a/d[k];
		q2=(b)/(2*p1);
		q1=c/q2;
		if (p1==1)
			fprintf(out,"(x");
		else
			if (p1==-1)
				fprintf(out,"(-x");
			else
				fprintf(out,"(%dx",p1);
		if (q1<0)
			fprintf(out,"%d)",q1);
		else
			fprintf(out,"+%d)",q1);
		if (p2==1)
			fprintf(out,"(x");
		else
			if (p2==-1)
				fprintf(out,"(-x");
			else
				fprintf(out,"(%dx",p2);
		if (q2<0)
			fprintf(out,"%d)",q2);
		else
			fprintf(out,"+%d)",q2);
		fclose(in);
		fclose(out);
		return 0;
	}
	else
	{
		if (k>nr*2)
		{
			fprintf(out,"-1\n");
			fclose(in);
			fclose(out);
			return 0;
		}
		p1=d[k/2+k%2];
		p2=a/p1;
		aux1=(b+int(sqrt(delta)))/(2*p1);
		aux2=(b-int(sqrt(delta)))/(2*p1);
		if (k%2)
		{
			q1=c/aux1;
			q2=aux1;
			if (c/aux2<q1)
			{
				q1=c/aux2;
				q2=aux2;
			}
		}
		else
		{
			q2=aux1;
			q1=c/aux1;
			if (q1<c/aux2)
			{
				q1=c/aux2;
				q2=aux2;
			}
		}
		if (p1==1)
			fprintf(out,"(x");
		else
			if (p1==-1)
				fprintf(out,"(-x");
			else
				fprintf(out,"(%dx",p1);
		if (q1<0)
			fprintf(out,"%d)",q1);
		else
			fprintf(out,"+%d)",q1);
		if (p2==1)
			fprintf(out,"(x");
		else
			if (p2==-1)
				fprintf(out,"(-x");
			else
				fprintf(out,"(%dx",p2);
		if (q2<0)
			fprintf(out,"%d)",q2);
		else
			fprintf(out,"+%d)",q2);
		fclose(in);
		fclose(out);
		return 0;
	}
	return 0;
}