Cod sursa(job #430099)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 30 martie 2010 19:05:19
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include<cstdio>
#include<math.h>
int auxp1,auxp2,auxq1,auxq2,l,x,x1s,x1j,x2s,x2j,A,B,C,k,m[100000][5];
int modul(int x)
{
	return x<0?(-x):x;
}
void getsol(int d)
{
	int p1,p2,q1,q2;
	p1=d;
	q1=-x1s*d/x1j;
	p2=A/d;
	q2=-x2s*A/(d*x2j);
	if(p1*p2==A && q1*q2==C && p1*q2+p2*q1==B)
	{
		bool ok=true;
		for(int i=1;i<=l;i++)
			if(m[i][1]==p1 && m[i][2]==q1 && m[i][3]==p2 && m[i][4]==q2)
			{
				ok=false;
				break;
			}
		if(ok==true)
		{
			++l;
			m[l][1]=p1;
			m[l][2]=q1;
			m[l][3]=p2;
			m[l][4]=q2;
		}
	}
	p1=d;
	q1=-x2s*d/x2j;
	p2=A/d;
	q2=-x1s*A/(d*x1j);
	if(p1*p2==A && q1*q2==C && p1*q2+p2*q1==B)
	{
		bool ok=true;
		for(int i=1;i<=l;i++)
			if(m[i][1]==p1 && m[i][2]==q1 && m[i][3]==p2 && m[i][4]==q2)
			{
				ok=false;
				break;
			}
		if(ok==true)
		{
			++l;
			m[l][1]=p1;
			m[l][2]=q1;
			m[l][3]=p2;
			m[l][4]=q2;
		}
	}
}
int getx1x2()
{
	int delta=B*B-4*A*C;
	if((int)sqrt(delta)*sqrt(delta)!=sqrt(delta)*sqrt(delta))
		return 0;
	x1s=-B-(int)sqrt(delta);
	x1j=2*A;
	x2s=-B+(int)sqrt(delta);
	x2j=2*A;
	return 1;
}
int main()
{
	freopen("ecuatie.in","r",stdin);
	freopen("ecuatie.out","w",stdout);
	scanf("%d%d%d%d",&A,&B,&C,&k);
	if(!getx1x2())
	{
		printf("-1");
		return 0;
	}
	x=(int)sqrt(modul(A));
	for(int i=1;i<=A;i++)
		if(A%i==0)
			getsol(i), getsol(-i), getsol(A/i), getsol(-A/i);
	for(int i=1;i<l;i++)
		for(int j=i+1;j<=l;j++)
			if(m[i][1]>m[j][1])
			{
				auxp1=m[i][1];
				auxq1=m[i][2];
				auxp2=m[i][3];
				auxq2=m[i][4];
				m[i][1]=m[j][1];
				m[i][2]=m[j][2];
				m[i][3]=m[j][3];
				m[i][4]=m[j][4];
				m[j][1]=auxp1;
				m[j][2]=auxq1;
				m[j][3]=auxp2;
				m[j][4]=auxq2;
			}
			else if(m[i][1]==m[j][1] && m[i][2]>m[j][2])
			{
				auxp1=m[i][1];
				auxq1=m[i][2];
				auxp2=m[i][3];
				auxq2=m[i][4];
				m[i][1]=m[j][1];
				m[i][2]=m[j][2];
				m[i][3]=m[j][3];
				m[i][4]=m[j][4];
				m[j][1]=auxp1;
				m[j][2]=auxq1;
				m[j][3]=auxp2;
				m[j][4]=auxq2;
			}
	printf("(");
	if(m[k][1]==-1) printf("-");
		else if(m[k][1]!=1) printf("%ld",m[k][1]);
	printf("x");
	if(m[k][2]<0) printf("%ld",m[k][2]);
		else printf("+%ld",m[k][2]);
	printf(")(");
	if(m[k][3]==-1) printf("-");
		else if(m[k][3]!=1) printf("%ld",m[k][1]);
	printf("x");
	if(m[k][4]<0) printf("%ld",m[k][4]);
		else printf("+%ld",m[k][4]);
	printf(")");
	return 0;
}