Cod sursa(job #237179)

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

long a, b, c, k, y, delta, x1, x2, aux, i, v[1000], p, t[1000], o, P1, P2, Q1, Q2, g;

int cmp(const void *w, const void *z) {
	return ( *(int*)w - *(int*)z );
}

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);
		}
	}
	qsort(v + 1, p, sizeof(v[0]), cmp);
	t[1] = v[1];
	o = 1;
	for (i = 2; i <= p; ++i) {
		if (v[i] != v[i - 1]) {
			t[++o] = v[i];
		}
	}
	if (k > o) {
		printf("-1");
		return 0;
	}
	if (k <= o) {
		g = k / 2;
		if (k % 2 == 1) {
			P1 = t[g + 1];
			Q1 = -x1 * t[g + 1];
			P2 = a / t[g + 1];
			Q2 = -x2 * (a / t[g + 1]);
		} else {
			P1 = t[g];
			Q1 = -x2 * t[g];
			P2 = a / t[g];
			Q2 = -x1 * (a / t[g]);
		}
		printf("(");
		if (P1 == 1) {
			printf("x");
		} else {
			if (P1 == - 1) {
				printf("-x");
			} else {
				printf("%ldx", P1);
			}
		}
		if (Q1 >= 0) {
			printf("+%ld)(", Q1);
		} else {
			printf("%ld)(", Q1);
		}
		if (P2 == 1) {
			printf("x");
		} else {
			if (P2 == -1) {
				printf("-x");
			} else {
				printf("%ldx", P2);
			}
		}
		if (Q2 >= 0) {
			printf("+%ld)", Q2);
		} else {
			printf("%ld)", Q2);
		}
	}
	return 0;
}