#include<stdio.h>
#define dim 500000
//#define dim1 30001
using namespace std;
long long v[dim], w[dim], b[dim], i,val,nr,put;
long long numarare(long long val, long long put, long long nr) //si asta face bine :D
{ int rez,val1;
rez = 0; val1 = 1;
for( i = 1; i <= put; i++ )
{ val1 *= val;
rez += (int)( nr / val1 );
}
return rez;
}
long long cb(long long in, long long sf, long long num) // in mare sper ca e corect, pare sa faca bine
{ long long mij,x,y;
mij = (in + sf)>>1;
x = mij * v[num];
y = numarare(v[num], w[num], x);
if( (y == w[num]) || (in == sf) || (mij == in) || (mij == sf))/*mij-1) || sf == mij+1)*/ return x;
else if( y < w[num] ) return cb(mij+1, sf, num);
else return cb(in, mij-1, num);
}
int main()
{ long long p,q,p1,t,k,r,i,a,max;
FILE *f = fopen("gfact.in", "r");
FILE *g = fopen("gfact.out", "w");
fscanf(f, "%lld%lld", &p, &q);
p1 = p; t = 0; //verificat, merge bine --
for(k = 2; k <= p1/2; k++)
{ r = 0;
while(p % k == 0) r++, p /= k;
if(r != 0) v[++t] = k, w[t] = r*q;
} // --
if( p != 1 ) v[1] = p1, w[1] = q, t = 1;
for( i = 1; i <= t; i++ ) //ar merge
{a = /*v[i] * */ w[i];
b[i] = cb(1, a, i);
}
max = 0; // face cum trebuie, logic...
for( i = 1; i <= t; i++ )
if(b[i] > max) max = b[i];
fprintf(g, "%lld\n", max);
fclose(f);
fclose(g);
return 0;
}