原版欧拉筛,内存占用大,容易MLE
std::vector<int>minp, primes;
void sieve(int n) {
minp.assign(n + 1, 0);
primes.clear();
for (int i = 2; i <= n; i++) {
if(minp[i]==0){
minp[i] = i;
primes.push_back(i);
}
for (auto p : primes) {
if (i * p > n)break;
minp[i * p]=p;
if (minp[i] == p)break;
}
}
}
新办欧拉筛,使用bitset数组,内存仅占原本的1/8
constexpr int N = 1e8;
std::vector<int> primes;
std::bitset<N> minp;
int sieve(int n) {
int cnt = 0;
primes.clear();
for (int i = 2; i <= n; i++) {
if (!minp[i]) {
primes.push_back(i);
cnt++;
}
for (auto p : primes) {
if (i * p > n)break;
minp[p * i] = true;
if (i % p == 0)break;
}
}
return cnt;
}