Pagini recente » Cod sursa (job #884616) | Cod sursa (job #643925) | Cod sursa (job #1758044) | Cod sursa (job #1092576) | Cod sursa (job #1106929)
#include <cstdio>
#include <algorithm>
using namespace std;
long long P,Q;
int b[1000000],ex[1000000];
long long sol;
inline void Divider()
{
int k=0,d=3,i;
while(P%2==0)
{
++k;
P/=2;
}
if(k)
{
b[++b[0]]=2;
ex[b[0]]=k;
}
while(P>1 && d*d<=P)
{
k=0;
while(P%d==0)
{
++k;
P/=d;
}
if(k)
{
b[++b[0]]=d;
ex[b[0]]=k;
}
d+=2;
}
if(P>1)
{
b[++b[0]]=P;
ex[b[0]]=1;
}
for(i=1;i<=b[0];++i)
ex[i]*=Q;
}
inline long long Nr(int B, long long n)
{
long long val=0,cb,b=B;
cb=b;
while(b<=n)
{
val+=(n/b);
b*=cb;
}
return val;
}
inline long long BSearch(int b, int exp)
{
long long st,dr,mij,sol;
st=1; dr=10000000000000000;
while(st<=dr)
{
mij=(st+dr)/2;
if(Nr(b,mij)>=exp)
{
sol=mij;
dr=mij-1;
}
else
st=mij+1;
}
return sol;
}
int main()
{
int i;
freopen ("gfact.in","r",stdin);
freopen ("gfact.out","w",stdout);
scanf("%lld%lld", &P,&Q);
Divider();
for(i=1;i<=b[0];++i)
sol=max(sol, BSearch(b[i],ex[i]));
printf("%lld\n", sol);
return 0;
}