Pagini recente » Cod sursa (job #1299227) | Cod sursa (job #189115) | Cod sursa (job #2245683) | Cod sursa (job #2959775) | Cod sursa (job #2659804)
#include <fstream>
using namespace std;
ifstream fin( "gfact.in" );
ofstream fout( "gfact.out" );
const int NMAX = 2000000000;
const int RADMAX = 45000;
const int NRdivizorMAX = 30;
int divizor[NRdivizorMAX], e[NRdivizorMAX];
int nrdivizor;
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 ){
divizor[nrdivizor] = d;
e[nrdivizor++] = cnt * q;
}
++d;
}
if( p > 1 ){
divizor[nrdivizor] = p;
e[nrdivizor++] = 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 < nrdivizor; ++i )
if( legendre(n, divizor[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;
}