Cod sursa(job #578775)

Utilizator Catah15Catalin Haidau Catah15 Data 11 aprilie 2011 16:30:56
Problema GFact Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;

#define maxRAD 44800
#define PB push_back
#define LL long long
#define maxD 60000000000002LL


vector <int> v, primes;
bool cont[maxRAD];
int P, Q;
LL exxp[maxRAD];
LL a[maxRAD];
LL sol = maxD;


void ciur ()
{
	cont[1] = true;
	
	int rad = (int) sqrt ( (double) P );
	
	primes.PB (2);
	
	for (int i = 3; i <= rad; i += 2)
	{
		if (cont[i]) continue;
		
		primes.PB (i);
		
		for (int j = i + i; j <= rad; j += i)
			cont[j] = true;
	}
}



void getPrimes_factor (int Q)
{
	int rad = (int) sqrt ( (double) Q );

	for (unsigned int i = 0; i < primes.size(); ++ i)
	{
		if (primes[i] > rad) break;
		if (Q == 1) break;
		if (Q % primes[i]) continue;
		
		v.PB (primes[i]);
		
		while ( ! (Q % primes[i]) )
		{
			++ exxp[v.size() - 1];
			
			Q /= primes[i];
		}
	}
	
	if (Q != 1)
	{
		v.PB (Q);
		exxp[v.size() - 1] = 1;
	}
}



int valid (LL Q)
{
	memset (a, 0, sizeof (a));
	
	for (unsigned int i = 0; i < v.size(); ++ i)
	{
		LL c = Q;
		
		while (c != 0)
		{
			c /= primes[i];
			a[i] += c;
		}
	}
	
	for (unsigned int i = 0; i < v.size(); ++ i)
	{
		if (a[i] < exxp[i]) return 0;
	}
	
	return 1;
}



void bin_Search ()
{
	LL st = 1, dr = maxD, mid;
	
	ofstream g("gfact.out");
	
	for (LL i = st; i < dr; ++ i)
		if (valid (i))
		{
			g << i;
			return;
		}
}



int main()
{
	ifstream f("gfact.in");

	
	f >> P >> Q;
	
	ciur ();
	
	getPrimes_factor (P);
	
	
	for (unsigned int i = 0; i < v.size(); ++ i)
		exxp[i] *= Q;

	
	bin_Search ();
	
	
	//g << sol;
	
	return 0;
}