Pagini recente » Cod sursa (job #2791909) | Cod sursa (job #2935294) | Cod sursa (job #2305035) | Cod sursa (job #3138014) | Cod sursa (job #1593193)
#include<cstdio>
#include<cmath>
#include<algorithm>
#define DIM 50
using namespace std;
int k;
long long P, Q, MAX;
long long w[DIM], v[DIM];
const long long INF (1 << 63);
void desc(int);
long long bs(int, int); //(long long, long long);
int main()
{
freopen("gfact.in","r",stdin);
freopen("gfact.out","w",stdout);
scanf("%d%d", &P, &Q);
desc(P);
for (int i = 1; i <= k; i++)
MAX = max(MAX, bs(v[i], w[i] * Q));
printf("%lld", MAX);
}
void desc(int A)
{
if (A % 2 == 0)
{
v[++k] = 2;
while (A % 2 == 0)
{
w[k]++;
A /= 2;
}
}
for (int i = 3; i * i <= A; i++)
if (A % i == 0)
{
v[++k] = i;
while (A % i == 0)
{
w[k] ++;
A /= i;
}
}
if (A > 1)
v[++k] = A, w[k] = 1;
}
long long bs(int A, int B)
{
long long left = 0, right = 1LL * A * B;
while (left <= right)
{
long long ans = (left + right) / 2;
int sol = 0, C = A;
while (C <= ans)
{
sol += ans / C;
C *= A;
}
if (sol < B)
left = ans + 1;
else
right = ans - 1;
}
return left;
}