Cod sursa(job #111442)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 29 noiembrie 2007 20:36:51
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.17 kb
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int a,b,c,x1,x2;
int k,v[2000],x=3,y=-1,j;

int compara(const void*a, const void*b){
	return ( *(int*)a - *(int*)b );
}

int compar1(int i,int j){
	if (i>j)
		return j;
	return i;
}

int compar2(int i,int j){
	if (i<j)
		return j;
	return i;
}

inline int rad(int n){
	return floor(sqrt(n));
}

int iesire(int n){
	printf("%d\n",n);
	exit(0);
}

inline int afla(int k,int x){
	return (k-1)/2;
}

inline int afla2(int k,int x){
	return k-1;
}

void aflu_radacini(){
	long long delta=b*b-4*a*c;
	if (delta<0)
		iesire(-1);
	int r=rad(delta);
	if (r*r!=delta)
		iesire(-1);
	x1=(r-b)/(2*a);
	x2=(-r-b)/(2*a);
	if (delta==0){
		int yy1=v[afla2(k,x)];
		int ii1=yy1*x1*-1;
		int ii3=ii1;
		int ii4=ii3;
		char s1='+',s2='+';
		int yy2=a/yy1; 
		if (ii3<0){
			s1='-';
			ii3*=-1;
		}
		if (ii4<0){
			s2='-';
			ii4*=-1;
		}
		if (yy1==1){
			if (yy2==1)
				printf("(x%c%d)(x%c%d)",s1,ii3,s2,ii4);
			else if (yy2==-1)
				printf("(x%c%d)(-x%c%d)",s1,ii3,s2,ii4);
			else printf("(x%c%d)(%dx%c%d)",s1,ii3,yy2,s2,ii4);
		}
		else if (yy1==-1){
			if (yy2==1)
				printf("(-x%c%d)(x%c%d)",s1,ii3,s2,ii4);
			else if (yy2==-1)
				printf("(-x%c%d)(-x%c%d)",s1,ii3,s2,ii4);
			else printf("(-x%c%d)(%dx%c%d)",s1,ii3,yy2,s2,ii4);
		}
		else{
			if (yy2==1)
				printf("(%dx%c%d)(x%c%d)",yy1,s1,ii3,s2,ii4);
			else if (yy2==-1)
				printf("(%dx%c%d)(-x%c%d)",yy1,s1,ii3,s2,ii4);
			else 
				printf("(%dx%c%d)(%dx%c%d)",yy1,s1,ii3,yy2,s2,ii4);
		}
		exit(0);
	}
}

int modul(int x){
	if (x<0)
		return -x;
	return x;
}

void afla_divizori_a(){
	for (int i=1;i<sqrt(modul(a));++i){
			if (a%i==0){
				v[y+1]=i*-1;
				v[y+2]=i;
				v[y+3]=(-a)/i;
				v[y+4]=a/i;
				y+=4;
			}
	}
	int sqr=floor(sqrt(modul(a)));
	if (sqr*sqr==a){
		v[y+1]=-sqr;
		v[y+2]=sqr;
		x=y+2;
	}
	else{
		v[y+1]=-sqr;
		v[y+2]=sqr;
		v[y+3]=(-a)/sqr;
		v[y+4]=a/sqr;
		x=y+4;
	}
}

int main(){
	freopen("ecuatie.in","r",stdin);
	freopen("ecuatie.out","w",stdout);
	scanf("%d%d%d%d",&a,&b,&c,&k);
	afla_divizori_a();
	if (2*x+2<k)
		iesire(-1);
	qsort(v,x+1,sizeof(int),compara);
	//for (int i=0;i<=x;++i)
		//printf("%d ",v[i]);
	//printf("\n");
	aflu_radacini();
	int yy1=v[afla(k,x)];
	int ii1=yy1*x1*-1;
	int ii2=yy1*x2*-1;
	int ii3=compar2(ii1,ii2);
	if (k%2==1)
		ii3=compar1(ii1,ii2);
	int ii4=c/ii3;
	char s1='+',s2='+';int yy2=a/yy1; 
	if (ii3<0){
		s1='-';
		ii3*=-1;
	}
	if (ii4<0){
		s2='-';
		ii4*=-1;
	}
	if (yy1==1){
		if (yy2==1)
			printf("(x%c%d)(x%c%d)",s1,ii3,s2,ii4);
		else if (yy2==-1)
			printf("(x%c%d)(-x%c%d)",s1,ii3,s2,ii4);
		else printf("(x%c%d)(%dx%c%d)",s1,ii3,yy2,s2,ii4);
	}
	else if (yy1==-1){
		if (yy2==1)
			printf("(-x%c%d)(x%c%d)",s1,ii3,s2,ii4);
		else if (yy2==-1)
			printf("(-x%c%d)(-x%c%d)",s1,ii3,s2,ii4);
		else printf("(-x%c%d)(%dx%c%d)",s1,ii3,yy2,s2,ii4);
	}
	else{
		if (yy2==1)
			printf("(%dx%c%d)(x%c%d)",yy1,s1,ii3,s2,ii4);
		else if (yy2==-1)
			printf("(%dx%c%d)(-x%c%d)",yy1,s1,ii3,s2,ii4);
		else 
			printf("(%dx%c%d)(%dx%c%d)",yy1,s1,ii3,yy2,s2,ii4);
	}
	//printf("%d\n",x);
	return 0;
}