Pagini recente » Cod sursa (job #147344) | Cod sursa (job #1892476) | Cod sursa (job #1782225) | Cod sursa (job #940439) | Cod sursa (job #2079916)
#include <bits/stdc++.h>
using namespace std;
void factorisation(int64_t num, vector< int64_t >& prime_factors) {
for (int i = 2; 1LL * i * i <= num; ++i) {
if (num % i != 0)
continue;
prime_factors.push_back(1LL * i);
while (num % i == 0)
num /= i;
}
if (num > 1)
prime_factors.push_back(num);
}
void solve() {
int64_t num, ord;
cin >> num >> ord;
vector< int64_t > prime_factors;
factorisation(num, prime_factors);
int max_fact_config = (1 << prime_factors.size()) - 1;
int64_t left = 1, right = (1LL << 61);
while (left <= right) {
int64_t middle = (left + right) / 2;
int64_t coprime_count = middle;
for (int config = 1; config <= max_fact_config; ++config) {
int64_t prime_structure = 1;
for (int i = 0; i < (int)prime_factors.size(); ++i)
if ((config >> i) & 1LL)
prime_structure *= prime_factors[i];
if (__builtin_popcount(config) % 2 == 1)
coprime_count -= middle / prime_structure;
else
coprime_count += middle / prime_structure;
}
if (coprime_count >= ord)
right = middle - 1;
else
left = middle + 1;
}
cout << left << endl;
}
int main() {
assert(freopen("frac.in", "r", stdin));
assert(freopen("frac.out", "w", stdout));
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
solve();
return 0;
}