Pagini recente » Cod sursa (job #1503084) | Cod sursa (job #2320727) | Cod sursa (job #1126294) | Cod sursa (job #2473916) | Cod sursa (job #1334750)
#include<cstdio>
#include<math.h>
using namespace std;
struct Doica
{
int x,y;
};
Doica v[15];
long long legendre(long long p,long long n)
{
long long s=0;
while(n)
{
s+=(n/p);
n/=p;
}
return s;
}
long long bs(long long poz)
{
long long med,last=-1;
long long st=1;
long long dr=((1LL<<60)-1);
while(st<=dr)
{
med=st+((dr-st)>>1);
if(legendre(v[poz].x,med)>=v[poz].y)
{
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
long long prim(long long x)
{
if(x==0||x==1)
return 1;
else
{
if(x==2)
return 1;
else
{
if(x%2==0)
return 0;
else
{
long long lim=(int)sqrt(x);
for(int i=3;i<=lim;i=i+2)
{
if(x%i==0)
return 0;
}
}
}
}
return 1;
}
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
long long p,q,max=0,nr=0,nr1,x,i;
scanf("%lld%lld",&p,&q);
if(prim(p)==1)
{
v[1].x=p;
v[1].y=q;
printf("%lld",bs(1));
}
else
{
int lim=(int)sqrt(p);
for(i=2;i<=lim;++i)
{
if(prim(i)==1&&p%i==0)
{
nr1=0;
while(p%i==0)
{
p/=i;
nr1++;
}
v[++nr].x=i;
v[nr].y=nr1*q;
if(prim(p)==1)
{
v[++nr].x=p;
v[nr].y=q;
}
else
{
if(p==1)
break;
}
}
}
for(i=1;i<=nr;++i)
{
x=bs(i);
if(max<x)
max=x;
}
printf("%lld",max);
}
return 0;
}