Cod sursa(job #245774)

Utilizator ilincaSorescu Ilinca ilinca Data 18 ianuarie 2009 20:07:34
Problema GFact Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <stdio.h>
#include <limits.h>


int p, q;


inline int min (int a, int b)
{
	if (a < b)
		return a;
	return b;
}

int mult (int fact, int w)
{
	int p, s;
	for (s=0, p=fact; w >= p; p*=fact)
		s+=w/p;
	return s;
}

int binary_search (int d, int p)
{
	int st=1, dr=INT_MAX, m;
	while (st < dr)
	{
		m=(st+dr) >> 1;
		if (mult (d, m) >= p)
			dr=m;
		else
			st=m+1;
	}
	if (mult (d, st) == p)
		return st;
	return -1;
}

int descomp ()
{
	int d, num, n=INT_MAX;
	for (d=2; d*d <= p; ++d)
		if (p % d == 0)	
		{
			num=0;
			while (p % d == 0)
			{
				++num;
				p/=d;
			}
			n=min (n, binary_search (d, num*q));
		}
	if (p > 1)
		n=min (n, binary_search (p, q));
	return n;
}

int main ()
{
	freopen ("gfact.in", "r", stdin);
	freopen ("gfact.out", "w", stdout);
	scanf ("%d%d", &p, &q);
	printf ("%d\n", descomp ());
	return 0;
}