线性筛(筛素数)
用筛法求素数的基本思想是:把从1开始的、某一范围的正整数从小到大排列,1不是素数,首先把它筛掉。剩下的数中选择最小的是素数的数,然后筛掉它的倍数。以此类推直到结束。
int vis[MaxN]; void Sieve() { for(int i = 2;i <= MaxN;i++) { if(vis[i]) continue; for(int j = 2*i;j <=MaxN;j += i) { vis[j] = 1; } } }
如果 vis [i] == 0,则 i 为素数。
时间复杂度的计算:
对于挑选素数的方法:
一层循环 n 次,根据素数定理,即小于 m 的所有数中有 m/ln(m) 个素数。在算法中为 sqrt(n) / ln(sqrt(n)),于是时间复杂度为 O(n*sqrt(n) / lg(n))。
对于素数筛的方法:
同上。