Pagini recente » Cod sursa (job #1551708) | Cod sursa (job #2786558) | Cod sursa (job #1224547) | Cod sursa (job #3158370) | Cod sursa (job #2661231)
#include <fstream>
#include <cstdio>
using namespace std;
ifstream cin ("gfact.in");
ofstream cout ("gfact.out");
#define PMAX 2000000000
#define QMAX 30000
#define MAXDIV 15
int divprim[MAXDIV], putere_prim[MAXDIV];
long long legendre( long long fact, long long nrprim ) {
long long ans = 0;
long long putere = nrprim;
while ( putere <= fact ) {
ans += (fact / putere);
putere *= nrprim;
}
return ans;
}
bool verif( long long fact, int nrdivprimi ) {
int i;
for ( i = 0; i < nrdivprimi; i++ )
if ( legendre( fact, divprim[i] ) < putere_prim[i] )
return 0;
return 1;
}
int main()
{
int p, q, div, nrdivprimi, putere;
long long st, dr, mij;
cin >> p >> q;
div = 2;
nrdivprimi = 0;
while ( div * div < p ) {
putere = 0;
while ( p % div == 0 ) {
putere++;
p /= div;
}
if ( putere > 0 ) {
divprim[nrdivprimi] = div;
putere_prim[nrdivprimi] = putere * q;
nrdivprimi++;
}
div++;
}
if ( p > 1 ) {
divprim[nrdivprimi] = p;
putere_prim[nrdivprimi] = q;
nrdivprimi++;
}
st = 0;
dr = (long long)PMAX * QMAX;
while ( dr - st > 1 ) {
mij = ( st + dr ) / 2;
if ( verif( mij, nrdivprimi ) == 0 )
st = mij;
else
dr = mij;
}
cout << dr;
return 0;
}