一、用于计算第 \(k\) 个质数是多少
#include <cstdio>
#include <cmath>
#define int long long
// 2147483647 -> 105097565位质数
// 1e9 + 7 -> 50847535位质数
const int maxn = 1e7 + 5;
int n, cnt, c[maxn], f[maxn];
bool is[maxn];
inline int G(int n, int m) {
// printf("%d %d\n",n,m);
if (m == 1) return (n + 1) >> 1;
if (n <= maxn - 5) {
int tmp = std::sqrt(n);
if (f[tmp] <= m) return f[n] - m + 1;
}
return G(n, m - 1) - G(n / c[m], m - 1);
}
inline int check(int x) {
// printf("%lld\n",x);
int tmp = std::sqrt(x);
return f[tmp] + G(x, f[tmp]) - 1;
}
signed main() {
for (int i = 2; i <= maxn - 5; i++) {
if (!is[i]) {
c[++cnt] = i;
}
for (int j = 2; i * j <= maxn - 5; j++)
is[i * j] = 1;
f[i] = f[i - 1] + !is[i];
}
scanf("%lld", &n);
int l = 2, r = 3e10, ans = 0;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid) >= n) {
r = mid - 1;
ans = mid;
} else
l = mid + 1;
}
printf("%lld\n", ans);
return 0;
}