Cod sursa(job #327003)

Utilizator rumburakrumburak rumburak Data 26 iunie 2009 19:46:09
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<cstdio>

const int N=30;
const long long lim=((long long)1<<60);

int p,q,d[N],e[N],nrd;

void descompun(int n)
{
	for(int i=2 ; i*i<=n ; ++i)
		if(n%i==0)
		{
			d[++nrd]=i;
			e[nrd]=0;
			while(n%i==0)
			{
				n/=i;
				++e[nrd];
			}
		}
	if(n!=1)
	{
		d[++nrd]=n;
		e[nrd]=1;
	}
}

bool ok(long long n,int a,int b)
{
	long long r=0;
	while(n)
	{
		n/=a;
		r+=n;
	}
	return r>=b*q;
}

bool div(long long n)
{
	for(int i=1;i<=nrd;++i)
		if(!ok(n,d[i],e[i]))
			return false;
	return true;
}

long long calcul()
{
	long long st=1,dr=lim,m;
	while(st!=dr)
	{
		m=(st+dr)>>1;
		if(div(m))
			dr=m;
		else
			st=m+1;
	}
	return st;
}

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