蒟蒻求助
查看原帖
蒟蒻求助
201007
Leasier楼主2021/1/31 16:35

RT,不知道为什么 TLE 了qwq

代码:

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

typedef unsigned long long ull;

const int N = 1e9 + 7, M = 7, P = 1 << (M - 1), Q = (N >> M) + 7, R = 6;
int addition[R + 7] = {0, 4, 0, 0, 0, 2};
ull a[Q], sum[Q];

inline int pop_count(ull n){
	int ans = 0;
	while (n){
		n &= n - 1;
		ans++;
	}
	return ans;
}

inline void init(){
	int t = sqrt(N - 1);
	for (register int i = 9; i < N; i += 6){
		int x = (i - 3) >> M, y = ((i - 3) >> 1) & (P - 1);
		a[x] |= 1ull << y;
	}
	for (register int i = 5; i <= t; i += addition[i % R]){
		int u = (i - 3) >> M, v = ((i - 3) >> 1) & (P - 1);
		if (!(a[u] & (1ull << v))){
			int i_mul_2 = i * 2;
			for (register int j = i * i; j < N; j += i_mul_2){
				int x = (j - 3) >> M, y = ((j - 3) >> 1) & (P - 1);
				a[x] |= 1ull << y;
			}
		}
	}
	for (register int i = 0; i < Q; i++){
		sum[i] = sum[i - 1] + pop_count(~a[i]);
	}
}

inline int get_nth_prime(int n){
	n -= 2;
	if (n == -1) return 2;
	int x = lower_bound(sum, sum + Q, n) - sum, y = sum[x], ans = P * (x + 1);
	for (register int i = P - 1; i >= 0; i--){
		if (!(a[x] & (1ull << i)) && --y == n) return ((ans - 1) << 1) + 3; 
		ans--;
	}
}

int main(){
	int q;
	cin >> q;
	init();
	for (register int i = 1; i <= q; i++){
		int k;
		cin >> k;
		cout << get_nth_prime(k) << endl;
	}
	return 0;
}
2021/1/31 16:35
加载中...