素數篩

1. 思路:對於不超過n的每一個非負整數p(>=2),刪去除1*p外全部倍數,處理完全部數後還剩下的就是素數。優化

1 void prime() //複雜版 2 {
3     mem(vis); //是否被刪去
4     for(int i=2;i<=n;i++)
5         for(int j=i*2;j<=n;j+=i)
6             vis[j]=1;
7 }
1 void prime() //優化版
2 {
3     int m=sqrt(n+0.5);
4     mem(vis); //是否被刪去
5     for(int i=2;i<=m;i++)
6         if(!vis[i])  //用素數篩 7             for(int j=i*i;j<=n;j+=i) //防止重複篩
8                 vis[j]=1;
9 }

2. 複雜度:內層循環次數是 ⌊n/i⌋ - 1< n/i,O(nlogn)spa

3. tips:①素數定理 --- Π(x) ~ x/lnx, 即不超過x的素數個數與x/lnx比較接近code

相關文章
相關標籤/搜索