Cod sursa(job #354153)

Utilizator DeadEyeNaiba Mihai Lucian DeadEye Data 7 octombrie 2009 11:23:17
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include<cstdio>
const long long MAX=(long long)1<<60;
int p,q,n,a[100000],b[100000];
long long i;
void fact(int m)
{
    for(int i=2;i*i<=m;i++)
	{
		if((m%i)==0)
		{
			++n;
			a[n]=i;
		}
		while(m%i==0)
		{
			++b[n];
			m/=i;
		}
	}
	if(m!=1)
	{
		++n;
		a[n]=m;
		b[n]=1;
	}
}
bool v(int x, int y, int z)
{
	int nf=0;
	while(x)
	{
		nf+=x/y;
		x/=y;
	}
	if(nf>=z)
		return true;
	return false;
}
bool ok(int x)
{
	for(int k=1;k<=n;k++)
		if(v(x,a[k],b[k]*q)==false)
			return false;
    return true;
}
int main()
{
	long long x;
	freopen("gfact.in","r",stdin);
	freopen("gfact.out","w",stdout);
	scanf("%d%d",&p,&q);
	n=0;
	fact(p);
	x=MAX;
	for(i=1;x;x>>=1)
	{
		if(!ok(x+i))
		{
			i+=x;
		}
	}
	printf("%lld ",i+1);
	printf("\n");
	return 0;
}