Pagini recente » Cod sursa (job #2216873) | Cod sursa (job #391193) | Cod sursa (job #1770573) | Cod sursa (job #1995954) | Cod sursa (job #959799)
Cod sursa(job #959799)
#include<stdio.h>
#include<math.h>
long long dp[20],de[20],nr,p,q;
void desc(int p)
{
int i,j,max=sqrt(p);
for(i=2;i<=max;++i)
{
if(p%i==0)
{
j=0;
while(p%i==0)
{
p=p/i;
j++;
}
nr++;
dp[nr]=i;
de[nr]=j;
}
}
if(p)
{
nr++;
dp[nr]=p;
de[nr]=1;
}
}
int bun(long long n)
{
int i;
long long aux,num;
for(i=1;i<=nr;++i)
{
aux=n;
num=0;
while(aux>=dp[i]&&aux>0)
{
num+=aux/dp[i];
aux=aux/dp[i];
if(num>=de[i])
break;
}
if(num<de[i])
return 0;
}
return 1;
}
long long cautb()
{
int i;
long long s,d,m,l;
for(i=1;i<=nr;++i)
{
de[i]=de[i]*q;
s=1;
d=1LL<<60;
while(s<=d)
{
m=(s+d)/2;
if(bun(m))
{
l=m;
d=m-1;
}
else
s=m+1;
}
}
return l;
}
int main() //dp,de
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
long long sol;
scanf("%d%d",&p,&q);
desc(p);
sol=cautb();
printf("%lld\n",sol);
return 0;
}