筛法
欧拉筛法
void euler(int n, vector<int>& primes)
{
primes.clear();
vector<bool> isPrime(n + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
primes.push_back(i);
}
for (int p : primes) {
if (1ll * i * p > n) break;
isPrime[i * p] = false;
if (i % p == 0) break;
}
}
}
埃拉托斯特尼筛法
void eratosthenes(int n, vector<int>& primes)
{
primes.clear();
vector<bool> isPrime(n + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= n; i++) {
if (!isPrime[i]) continue;
primes.push_back(i);
if (ll(i) * i > n) continue;
for (int j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
最后更新于
这有帮助吗?