线性筛是一种可以做到
O
(
n
)
O(n)
O(n)时间复杂度筛选质数的算法。它的一个重要前提是需要开一个N长度的数组来存对应数字是否为质数。
这也就意味着,这个数组每一个元素所占内存越小,最后能筛的质数也就越大。
考虑到int占4个字节,而bool只占1个字节,我们在题目里常常会用bool数组来存下标。但c++里提供了占用内存更小的bitset容器,它跟bool一样每个元素只能用
0
0
0
1
1
1来表示,但它每一个元素只占用
1
/
8
1/8
1/8个字节,并且对于线性筛来说它具有一定的速度优化的效果。
const int N = 1e7+5;
bitset<N> st;
vector<int> prime(N>>1);
int cnt;
get_prime()
{
for(int i=2; i<=n; i++){
if(!st[i]) prime[cnt++]=i;
for(int j=0; prime[j]*i <= n; j++){
st[prime[j]*i]=true;
if(i%prime[j]==0) break;
}
}
}