Pagini recente » Cod sursa (job #1986471) | Cod sursa (job #2713757) | Cod sursa (job #1433760) | Cod sursa (job #2464836) | Cod sursa (job #66933)
Cod sursa(job #66933)
#include <cstdio>
#include <cmath>
#define maxdiv 50000
FILE *in = fopen("gfact.in","r"), *out = fopen("gfact.out","w");
int p, q;
int t[maxdiv];
int r[maxdiv];
int k;
void factorizare()
{
int sq = (int)sqrt(p) + 1;
if ( (p&1) == 0 )
{
t[k] = 2;
while ( (p&1) == 0 )
p >>= 1, ++r[k];
++k;
}
for ( int i = 3; i <= sq; i += 2 )
{
if ( p % i == 0 )
{
t[k] = i;
while ( p % i == 0 )
p /= i, ++r[k];
++k;
}
}
if ( p > 1 )
t[k] = p, r[k++] = 1;
}
long long putere(long long fact, int p)
{
long long rez = 0;
while ( fact )
{
rez += fact / p;
fact /= p;
}
return rez;
}
int main()
{
fscanf(in, "%d %d", &p, &q);
factorizare();
long long sol = 0;
for ( int i = 0; i < k; ++i )
{
int lo = 1;
long long hi = r[i] * q;
long long answ = 0;
while ( lo <= hi )
{
long long m = (lo + hi) >> 1;
long long b = m * t[i];
long long z = putere(b, t[i]);
if ( z > r[i] * q )
answ = b, hi = m - 1;
else if ( z < r[i] * q )
lo = m + 1;
else
{
answ = b;
break;
}
}
//printf("%d\n", answ);
if ( answ > sol )
sol = answ;
}
fprintf(out, "%lld\n", sol);
return 0;
}