Pagini recente » Cod sursa (job #312017) | Cod sursa (job #2696686) | Cod sursa (job #3038387) | Cod sursa (job #2385108) | Cod sursa (job #2518709)
#include <fstream>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;
ifstream in("frac.in");
ofstream out("frac.out");
vector<bool> prim(1000000);
vector<int> prims;
vector<int> divs (1000000);
long long N, P, card_u, A;
int n;
void rec(int pos, int left, long res) {
if (pos == n) {
if (!left) card_u += A / res;
return;
}
if (!left) {
card_u += A / res;
return;
}
rec(pos+1, left, res);
rec(pos+1, left-1, res * divs[pos]);
}
int main() {
for (int i = 2; i < 1000000; i++)
if (!prim[i]) {
prims.push_back(i);
for (int j = 2 * i; j < 1000000; j += i)
prim[j] = 1;
}
in >> N >> P;
n = 0;
for (int prim : prims) {
if (prim > N) break;
if (N % prim == 0)
divs[n++] = prim;
}
long long left = 1, right = LLONG_MAX;
long long res = -1;
while (left <= right) {
A = left + (right - left) / 2;
card_u = 0;
for (int j = 1; j <= n; ++j) {
if (j % 2 == 1) rec(0, j, 1);
else rec(0, j, -1);
}
if (A - card_u == P) {
res = A;
right = A - 1;
} else if (A - card_u > P) {
right = A - 1;
} else {
left = A + 1;
}
}
out << res;
}