定义

欧拉筛是一种用于求素数的高效筛法,时间复杂度为O(n)
核心思想:每个合数都可以被表示为:n = min_prime * k(k ≥ min_prime)

实现

constexpr int N = 100010;  
vector<int> primes;  
bitset<N> is_not_prime;  
void eular(const int& n)  
{  
    for (int i = 2; i <= n; i++)  
    {  
        if (!is_not_prime[i])  
            primes.push_back(i); //不是素数则添加到primes中  
        for (const int& prime : primes) //筛出从i*2到i*最后一个素数的合数  
        {  
            if (i * prime > n)  
                break; //超出筛选范围就没有必要再筛了  
            is_not_prime[i * prime] = true; //标记(合数=最小质因数*另一个数)为非素数  
            if (i % prime == 0) //若真则i=prime(最小质因数)*另一个数(大于等于prime) 
                break; //接下来的Prime都比现在的prime大,  
                       //若继续循环则接下来的合数为(i*Prime=另一个数*Prime*prime)  
                       //此数应在I=另一个数*Prime时被I*prime标记而不是现在  
        }  
    }  
}