Cod sursa(job #285954)

Utilizator DraStiKDragos Oprica DraStiK Data 23 martie 2009 11:29:36
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <algorithm>
#include <math.h>
using namespace std;
#define DIM 1000005
struct rez {int p1,p2,q1,q2;} sol[DIM];
int a,b,c,k,x1,x2,nr;
double delta;
void print (int val)
{
	int i;
	if (!val || val>nr)
		printf ("-1");
	else
	{
		printf ("(%dx",sol[val].p1);
		if (sol[val].q1>0)
			printf ("+%d)",sol[val].q1);
		else
			printf ("%d)",sol[val].q1);
		printf ("(%dx",sol[val].p2);
		if (sol[val].q2>0)
			printf ("+%d)",sol[val].q2);
		else
			printf ("%d)",sol[val].q2);
	}
	exit (0);
}
void ecuatie ()
{
	int d;
	delta=sqrt (b*b-4*a*c);
	if ((int)delta!=(float)delta)
		print (0);
	d=(int)delta;
	x1=(-b-d)/(2*a);
	x2=(-b+d)/(2*a);
}
void divizori ()
{
	int d;
	for (d=1; d*d<=a; ++d)
		if (a%d==0)
		{
			sol[++nr].p1=d;
			sol[nr].q1=a/d;
			sol[nr].p2=-x1*d;
			sol[nr].q2=-x2*(a/d);
			sol[++nr].p1=-d;
			sol[nr].q1=-a/d;
			sol[nr].p2=x1*d;
			sol[nr].q2=x2*(a/d);
			sol[++nr].p1=a/d;
			sol[nr].q1=d;
			sol[nr].p2=-x1*(a/d);
			sol[nr].q2=-x2*d;
			sol[++nr].p1=-a/d;
			sol[nr].q1=-d;
			sol[nr].p2=x1*(a/d);
			sol[nr].q2=x2*d;
			
			sol[++nr].p1=d;
			sol[nr].q1=a/d;
			sol[nr].p2=-x2;
			sol[nr].q2=-x1*(a/d);
			sol[++nr].p1=-d;
			sol[nr].q1=-a/d;
			sol[nr].p2=x2*d;
			sol[nr].q2=x1*(a/d);
			sol[++nr].p1=a/d;
			sol[nr].q1=d;
			sol[nr].p2=-x2*(a/d);
			sol[nr].q2=-x1*d;
			sol[++nr].p1=-a/d;
			sol[nr].q1=-d;
			sol[nr].p2=x2*(a/d);
			sol[nr].q2=x1*d;
		}
	/*if (d*d==a)
	{
		sol[++nr].p1=d;
		sol[nr].q1=a/d;
		sol[nr].p2=-x1*d;
		sol[nr].q2=-x2*(a/d);
	}*/
} 
int cmp (rez a,rez b)
{
	return a.p1<b.p1 || (a.p1==b.p1 && a.q1<a.q2);
} 
void afis ()
{
    int i;
    for (i=1; i<=nr; ++i)
        printf ("%d %d %d %d\n",sol[i].p1,sol[i].q1,sol[i].p2,sol[i].q2);
}
int main ()
{
	freopen ("ecuatie.in","r",stdin);
	freopen ("ecuatie.out","w",stdout);
	scanf ("%d%d%d%d",&a,&b,&c,&k);
	ecuatie ();
	divizori ();
	sort (sol+1,sol+nr+1,cmp);
//	print (k);
	afis ();
	return 0;
}