Pagini recente » Cod sursa (job #810692) | Cod sursa (job #701006) | Cod sursa (job #2614873) | Cod sursa (job #3000904) | Cod sursa (job #2845276)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("frac.in");
ofstream fout("frac.out");
void testCase() {
int64_t n, p;
fin >> n >> p;
vector<int64_t> primes;
int64_t d = 2;
while (n > 1) {
if (n % d == 0) {
primes.emplace_back(d);
while (n % d == 0) {
n /= d;
}
}
if (d == 2) {
d = 3;
} else {
d += 2;
}
if (d * d > n) {
d = n;
}
}
auto check = [&](const int64_t &x) -> bool {
int64_t cnt = 0;
int m = primes.size();
for (int mask = 0; mask < (1 << m); ++mask) {
int64_t num = 1;
for (int i = 0; (1 << i) <= mask; ++i) {
if (mask & (1 << i)) {
num *= primes[i];
}
}
if (__builtin_popcount(mask) % 2 == 0) {
cnt += x / num;
} else {
cnt -= x / num;
}
}
return p <= cnt;
};
int64_t l = 1, r = (1LL << 61), ans = 1;
while (l <= r) {
int64_t mid = (l + r) / 2;
if (check(mid)) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
fout << ans << '\n';
}
int main() {
int tests = 1;
for (int tc = 0; tc < tests; ++tc) {
testCase();
}
fin.close();
fout.close();
return 0;
}