Cod sursa(job #631979)

Utilizator andunhillMacarescu Sebastian andunhill Data 9 noiembrie 2011 23:18:06
Problema Ecuatie Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<fstream>
#include<cmath>
using namespace std;

ifstream f("ecuatie.in");
ofstream g("ecuatie.out");

long long A, B, C, K;
long long delta, sqrdel, sqrA;

bool verf(long long k, long long p1, long long p2, long long q1, long long q2)
{	if(k < K) return 0;
	//g<<k<<": ";
	
	g<<"(";
	if(p1 == 1 || p1 == -1) (p1 == 1) ? g<<"x" : g<<"-x";
	else g<<p1<<"x";
	(q1 < 0) ? g<<q1 : g<<"+"<<q1;
	g<<")";
	
	g<<"(";
	if(p2 == 1 || p2 == -1) (p2 == 1) ? g<<"x" : g<<"-x";
	else g<<p2<<"x";
	(q2 < 0) ? g<<q2 : g<<"+"<<q2;
	g<<")"; g<<'\n';
	
	return 1;
}

bool make_ec(long long p1, long long p2, long long &k)
{	long long q1, q2;
	
	if(delta == 0)
	{	q1 = B / (2 * p2);
		q2 = C / q1; if(q2 * q1 != C) return 0;
		k++;
		if(verf(k, p1, p2, q1, q2)) return 1;
	}
	else
	{	q1 = min((B - sqrdel) / (2 * p2), (B + sqrdel) / (2 * p2)) ;
		
		if(q1) q2 =C / q1; 
		if(q2 * q1 == C && p1 * q2 + p2 * q1 == B) 
		{	k++;
			if(verf(k, p1, p2, q1, q2)) return 1;
		}
		
		q1 = max((B - sqrdel) / (2 * p2), (B + sqrdel) / (2 * p2)) ;
		
		if(q1) q2 =C / q1; 
		if(q2 * q1 == C && p1 * q2 + p2 * q1 == B)
		{	k++;
			if(verf(k, p1, p2, q1, q2)) return 1;
		}
	}
	return 0;
}

int main()
{	long long k, p1, p2;
	
	
	f>>A>>B>>C>>K;
	
	delta = B * B - 4 * A * C; k = 0;
	sqrdel = sqrt((double)delta);
	sqrA = sqrt((double)A);
	if(delta < 0 || sqrdel * sqrdel != delta) { g<<-1; return 0; }
	
	p1 = min(-A, A); p2 = A / p1;
	if(make_ec(p1, p2, k)) return 0;
	
	for(p1 = min(-A / 2, A / 2); p1 <= max(A / 2, -A / 2); p1++)
	{	if(p1 == 0 || A % p1) continue;
		p2 = A / p1;
		
		if(make_ec(p1, p2, k)) return 0;
	}
	p1 = max(-A, A); p2 = A / p1;
	if(make_ec(p1, p2, k)) return 0;
	
	g<<-1;
	
	f.close();
	g.close();
	return 0;
}