Cod sursa(job #237199)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 29 decembrie 2008 11:37:39
Problema Ecuatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

long a, b, c, k, delta, x1, x2, aux, i, v[1024], p, m[1024][9], o, y[1024][9], r;

int cmp(const void *a, const void *b) {
	long *c = (long *)a;
	long *d = (long *)b;
	return c[1] - d[1];
}

void elimin() {
	++r;
	for (long j = 1; j <= 4; ++j) {
		y[r][j] = m[1][j];
	}
	for (long i = 2; i <= o; ++i) {
		if (m[i][1] != m[i - 1][1] || m[i][2] != m[i - 1][2] || m[i][3] != m[i - 1][3] || m[i][4] != m[i - 1][4]) {
			++r;
			for (long j = 1; j <= 4; ++j) {
				y[r][j] = m[i][j];
			}
		}
	}
	o = r;
	for (long i = 1; i <= o; ++i) {
		for (long j = 1; j <= 4; ++j) {
			m[i][j] = y[i][j];
		}
	}
}


int main() {
	freopen("ecuatie.in", "r", stdin);
	freopen("ecuatie.out", "w", stdout);
	scanf("%ld%ld%ld%ld", &a, &b, &c, &k);
	delta = b * b - 4 * a * c;
	if (sqrt(delta) * sqrt(delta) != delta) {
		printf("-1");
		return 0;
	}
	x1 = (-b - sqrt(delta)) / (2 * a);
	x2 = (-b + sqrt(delta)) / (2 * a);
	aux = sqrt(abs(a));
	for (i = 1; i <= aux; ++i) {
		if (a % i == 0) {
			v[++p] = i;
			v[++p] = -i;
			v[++p] = a / i;
			v[++p] = a / (-i);
		}
	}
	for (i = 1; i <= p; ++i) {
		m[++o][1] = v[i];
		m[o][3] = a / v[i];
		m[o][2] = -x1 * m[o][1];
		m[o][4] = -x2 * m[o][3];
		m[++o][1] = v[i];
		m[o][3] = a / v[i];
		m[o][2] = -x2 * m[o][1];
		m[o][4] = -x1 * m[o][3];
	}
	qsort(m + 1, o, sizeof(m[0]), cmp);	
	elimin();
	if (k <= o) {
		i = k;
		printf("(");
		if (m[i][3] == 1) {
			printf("x");
		} else {
			if (m[i][3] == -1) {
				printf("-x");
			} else {
				printf("%ldx", m[i][3]);				
			}
		}
		if (m[i][4] > 0) {
			printf("+%ld)", m[i][4]);
		} else {
			printf("%ld)", m[i][4]);
		}
		printf("(");
		if (m[i][1] == 1) {
			printf("x");
		} else {
			if (m[i][1] == -1) {
				printf("-x");
			} else {
				printf("%ldx", m[i][1]);
			}
		}
		if (m[i][2] > 0) {
			printf("+%ld)", m[i][2]);
		} else {
			printf("%ld)", m[i][2]);
		}
		printf("\n");
	}
	if (k > o) {
		printf("-1");
		return 0;
	}
	return 0;
}