计算第k个质数为多少模版

一、用于计算第 \(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;
}
posted @ 2024-09-08 00:46  grape_king  阅读(23)  评论(0)    收藏  举报