Pagini recente » Cod sursa (job #276542) | Cod sursa (job #2687880) | Cod sursa (job #2524895) | Cod sursa (job #217629) | Cod sursa (job #1339928)
#include <cstdio>
using namespace std;
int f[15];
int e[15];
inline long legendre(long long n, int p)
{
unsigned long long s=0;
while(n){
s=s+n/p;
n/=p;
}
return s;
}
inline long long bs(int poz)
{
long long st,dr,med,nr,last=-1;
st=1;
dr=(1LL<<60)-1;
while(st<=dr){
med=(st+dr)/2;
nr=legendre(med,f[poz]);
if(nr<0)
nr=(1LL<<60)-1;
if(nr>=e[poz]){
last=med;
dr=med-1;
}
else
st=med+1;
}
return last;
}
int main()
{ freopen("gfact.in", "r",stdin);
freopen("gfact.out", "w",stdout);
int p,q,d,ex,nf=0,i;
long long b,max=1;
scanf("%d%d", &p, &q);
d=2;
while(1LL*d*d<=p && p>1){
ex=0;
while(p%d==0){
ex++;
p/=d;
}
if(ex>0){
f[++nf]=d;
e[nf]=ex*q;
}
d++;
}
if(p>1){
f[++nf]=p;
e[nf]=q;
}
for(i=1; i<=nf; i++){
b=bs(i);
if(b>max)
max=b;
}
printf("%I64d", max);
return 0;
}