Pagini recente » Cod sursa (job #1780193) | Cod sursa (job #565430) | Cod sursa (job #695101) | Cod sursa (job #497393) | Cod sursa (job #2659802)
#include <fstream>
using namespace std;
ifstream fin( "gfact.in" );
ofstream fout( "gfact.out" );
const int NMAX = 2000000000;
const int RADMAX = 45000;
const int NRDIVMAX = 30;
int div[NRDIVMAX], e[NRDIVMAX];
int nrdiv;
void desc( int p, int q ){
int d = 2, cnt;
while( d * d <= p ){
cnt = 0;
while( !(p % d) ){
++cnt;
p /= d;
}
if( cnt > 0 ){
div[nrdiv] = d;
e[nrdiv++] = cnt * q;
}
++d;
}
if( p > 1 ){
div[nrdiv] = p;
e[nrdiv++] = q;
}
}
long long legendre( long long n, int x ){
long long cnt = 0, val = x;
while( val <= n ){
cnt += (n / val);
val *= x;
}
return cnt;
}
bool verif( long long n, int p ){
int i;
for( i = 0; i < nrdiv; ++i )
if( legendre(n, div[i]) < e[i] )
return 0;
return 1;
}
int main() {
long long p, q, dr, st, med;
fin >> p >> q;
desc(p, q);
st = 0; dr = 1LL * NMAX * 30000;
while( dr - st > 1 ){
med = (st + dr) >> 1;
if( verif(med, p) == 0 )
st = med;
else
dr = med;
}
fout << dr;
return 0;
}