Pagini recente » Cod sursa (job #754680) | Cod sursa (job #2351764) | Cod sursa (job #2230128) | Cod sursa (job #272233) | Cod sursa (job #3223921)
#include <bits/stdc++.h>
using namespace std;
#define int long long int
#define N 1000006
bool ciur[N];
int n, p, st, dr, mij, ans;
vector <int> prime, f;
void eratostene() {
ciur[0] = ciur[1] = 1;
for (int i = 2; i * i < N; i++)
if (!ciur[i])
for (int j = 2; j * i < N; j++)
ciur[i * j] = 1;
for (int i = 2; i < N; i++)
if (!ciur[i])
prime.emplace_back(i);
}
void ia_factorii_primi(int b) {
int d = prime[0];
int l = 0;
while (b > 1 && d * d <= b) {
if (b % d == 0) {
f.emplace_back(d);
while (b % d == 0)
b /= d;
}
d = prime[++l];
}
if (b > 1)
f.emplace_back(b);
}
int pinex(int up_bound) {
/// functia asta imi returneaza numarul de numere prime cu n in intervalul [1...up_bound]
int neprime = 0;
for (int mask = 1; mask < (1 << f.size()); mask++) {
int nr_biti = __builtin_popcountll(mask);
int intersectie = 1;
for (int k = 0; k < f.size(); k++) {
if (mask & (1 << k)) {
intersectie *= f[k];
}
}
int big_jonathan = n / intersectie;
if (nr_biti % 2)
neprime += big_jonathan;
else
neprime -= big_jonathan;
}
return up_bound - neprime;
}
int pw(int a, int n) {
if (!n)
return 1;
else {
if (n % 2)
return a * pw(a, n-1);
else {
int c = pw(a, n/2);
return c * c;
}
}
}
signed main()
{
freopen("frac.in", "r", stdin);
freopen("frac.out", "w", stdout);
cin.tie(0)->sync_with_stdio(false);
cin >> n >> p;
eratostene();
ia_factorii_primi(n);
st = 1;
dr = pw(2, 61);
while (st <= dr) {
mij = st + (dr - st)/2;
if (pinex(mij) >= p)
ans = mij, dr = mij - 1;
else
st = mij + 1;
}
cout << ans;
return 0;
}