线性筛+孪生素数
如果你还不知道什么是线性筛,可以先去学一学模板
那么这题的做法就是根据素数表找到每一对孪生素数,再对数组进行前缀和处理
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
bool vis[N];
int primes[N];
int cnt = 0;
int a[N];
void get_primes() {
for (int i = 2; i < N; i++) {
if (!vis[i]) primes[cnt++] = i;
for (int j = 0; primes[j] < N / i; j++) {
vis[primes[j] * i] = 1;
if (i % primes[j] == 0) break;
}
}
}
int main() {
ios::sync_with_stdio(0);
get_primes();
for (int i = 0; i < cnt; i++) {
if (!vis[primes[i] + 2]) a[primes[i] + 2] = 1;
}
for (int i = 1; i < N; i++) a[i] += a[i - 1];
int t; cin >> t;
while (t--) {
int n;cin >> n;
cout << a[n] << "\n";
}
return 0;
}