Cod sursa(job #605995)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 3 august 2011 10:06:51
Problema Ecuatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

long long a,b,c,d,k;
vector <pair <long long,long long> > v;

inline void add(long long x)
{
	long long p1=x,p2=a/x;
	if ((b+(long long)d)%(2*p2)==0&&c%((b+(long long)d)/(2*p2))==0)
		v.push_back(make_pair(p1,(b+d)/(2*p2)));
	if (d&&(b-(long long)d)%(2*p2)==0&&c%((b-(long long)d)/(2*p2))==0)
		v.push_back(make_pair(p1,(b-d)/(2*p2)));
}

inline void write_sol(long long p1,long long q1)
{
	printf("(");
	if (p1<0)
	{
        printf("-");
		p1=-p1;
	}
	if (p1!=1)
		printf("%lld",p1);
	printf("x");
	if (q1>=0)
		printf("+");
	printf("%lld)",q1);
}

int main()
{
    long long i;
	freopen("ecuatie.in","r",stdin);
	freopen("ecuatie.out","write_sol",stdout);
	scanf("%lld %lld %lld %lld",&a,&b,&c,&k);
	d=sqrt(b*b-4*a*c);
	if (d<0||d*d!=b*b-4*a*c)
	{
		printf("-1\n");
		return 0;
	}
	for (i=1;i*i<abs(a);++i)
		if (a%i==0)
		{
			add(i);
			add(a/i);
			add(-i);
			add(-a/i);
		}
	if (((long long)sqrt(abs(a)))*((long long)sqrt(abs(a)))==abs(a))
	{
		add(sqrt(abs(a)));
		add(-sqrt(abs(a)));
	}
	sort(v.begin(),v.end());
	if (k>v.size())
	{
		printf("-1\n");
		return 0;
	}
    write_sol(v[k-1].first,v[k-1].second);
    write_sol(a/v[k-1].first,c/v[k-1].second);
	printf("\n");
	return 0;
}