Cod sursa(job #57400)

Utilizator peanutzAndrei Homorodean peanutz Data 1 mai 2007 22:25:10
Problema GFact Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <math.h>

#define NMAXSQRT 50000

int prim[NMAXSQRT];
long p, q;
long max;

void search(int p, int nr)
{
	int st, dr, m;
	int nrp, pow;
	int keep = -1;

	st = 1;
	dr = nr * p;

	while(st <= dr)
	{
		m = (st + dr) / 2;

		for(nrp = 0, pow = p; m / pow; nrp += m / pow, pow *= p);

		if(nrp >= nr)
		{
			keep = m;
			dr = m - 1;
		}
		else if(nrp < nr)
		{
			st = m + 1;
		}
	}

	if(max < keep)
		max = keep;
}

void ciur()
{
	int i, j, nr, aux;
	long until = sqrt(p);

	for(nr = 0, aux = p; !(aux % 2); aux /= 2, ++nr);
	if(nr != 0)
		search(2, nr * q);

	for(i = 3; i <= until; i += 2)
	{
		if(!prim[i])
		{
			for(nr = 0, aux = p; !(aux % i); aux /= i, ++nr);
			if(nr != 0)
				search(i, nr * q);

			for(j = i; j <= until; j += i)
			{
				prim[j] = 1;
			}
		}
	}
}

int main()
{
	freopen("gfact.in", "r", stdin);
	freopen("gfact.out", "w", stdout);

	scanf("%ld %ld\n", &p, &q);
	/*
	p = 12;
	q = 1;
	*/
	ciur();

	printf("%ld\n", max);

	fclose(stdin);
	fclose(stdout);

	return 0;
}