Pagini recente » Cod sursa (job #640039) | Cod sursa (job #2894390) | Cod sursa (job #796655) | Cod sursa (job #3184350) | Cod sursa (job #2871639)
//
// Created by Mihai145 on 3/15/2022.
//
#include <fstream>
#include <vector>
long long count(long long n, std::vector<long long>& primes) {
long long ans = 0;
for(int mask = 0; mask < (1 << (int)primes.size()); ++mask) {
long long prod = 1LL;
for(int b = 0; b < (int)primes.size(); b++) {
if(mask & (1 << b)) {
prod *= primes[b];
}
}
if(__builtin_popcount(mask) & 1) {
ans -= n / prod;
} else {
ans += n / prod;
}
}
return ans;
}
void calc_primes(long long n, std::vector<long long>& primes) {
for(int i = 2; 1LL * i * i <= n; ++i) {
if(n % i == 0) {
primes.push_back(i);
while(!(n % i)) { n /= i; }
}
}
if(n != 1) {
primes.push_back(n);
}
}
int main() {
std::ifstream cin("frac.in");
std::ofstream cout("frac.out");
long long n, p;
cin >> n >> p;
std::vector<long long> primes;
calc_primes(n, primes);
long long l = 1, r = (1LL << 61), sol = -1;
while(l <= r) {
long long mid = (l + r) >> 1;
if(count(mid, primes) >= p) {
sol = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
cout << sol << '\n';
return 0;
}