Pagini recente » Cod sursa (job #1257809) | Cod sursa (job #1605061) | Cod sursa (job #637299) | Cod sursa (job #414547) | Cod sursa (job #265089)
Cod sursa(job #265089)
#include <stdio.h>
#include <math.h>
#define LL long long
LL n, p, rad, d, m, st, dr, mid, nr, sol;
LL fact[110];
LL calc_div(LL val) {
LL rez = 0, n0;
for (LL i = 1; i < (1 << m); i++) {
n0 = 0; d = 1;
for (LL j = 0; j < m; j++)
if (i & (1 << j)) {
n0++;
d *= fact[j + 1];
}
if (n0 % 2 == 1) rez += val / d;
else rez -= val / d;
}
return rez;
}
int main() {
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
scanf("%lld %lld", &n, &p);
rad = (LL) sqrt(n); d = 1;
while (d < rad && n != 1) {
d++;
if (n % d == 0) fact[++m] = d;
while (n % d == 0) n /= d;
}
if (n != 1) fact[++m] = n;
st = 0; dr = 1LL * (1 << 31) * (1 << 30); mid = 0;
while (st + 1 < dr) {
mid = (st + dr) / 2;
nr = mid - calc_div(mid);
if (nr == p)
sol = mid;
if (nr >= p) dr = mid;
else st = mid;
}
printf("%lld\n", sol);
return 0;
}