欧拉筛,亲测bitset不开O2会最后两个点TLE,bool则AC:
#include <cstdio>
#include <bitset>
#include <vector>
constexpr int maxn = 1e8 + 5;
int main(){
int n,ans = 0;
std::vector <int> prime;
std::bitset <maxn> is_prime;
scanf("%d",&n);
is_prime[0] = is_prime[1] = 1;
for (int i = 2;i <= n;i++){
if (!is_prime[i]) prime.push_back(i),ans++;
for (int j = 0;j < prime.size() && i * prime[j] <= n;j++){
is_prime[i * prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
printf("%d\n",ans);
return 0;
}