Pagini recente » Cod sursa (job #2070305) | Cod sursa (job #563505) | Cod sursa (job #1487877) | Cod sursa (job #1575506) | Cod sursa (job #1150235)
#include <cstdio>
using namespace std;
long long P, ans;
int prim[13], nr, lim;
inline void preC (long long N) {
int k = 2;
while (N > 1) {
if (!(N % k)) {
prim[++nr] = k;
while (!(N % k))
N /= k;
}
if (k * k > N && N > 1) {
prim[++nr] = N;
break;
}
++k;
}
}
inline long long pinex (const long long &L) {
long long l, r = 0;
int i, j, p;
for (i = 1; i < lim; ++i) {
p = 0;
l = 1;
for (j = 0; j < nr; ++j)
if ((i >> j) & 1) {
++p;
l *= prim[j + 1];
}
if (p & 1)
r += L / l;
else
r -= L / l;
}
ans = L - r;
}
inline void bsearch () {
long long left = 1, right = (1LL << 61), middle;
lim = (1 << nr);
while (left <= right) {
middle = (1LL * (left + right)) >> 1;
pinex (middle);
if (ans >= P)
right = middle - 1;
else
left = middle + 1;
}
printf ("%lld", middle);
}
int main () {
freopen ("frac.in", "r", stdin);
freopen ("frac.out", "w", stdout);
long long N;
scanf ("%lld%lld", &N, &P);
preC (N);
bsearch ();
}