int prime[maxn],tot;
bool is_prime[maxn];
void choose(int n)
}}
考慮你在設計乙個線性篩質數演算法
你想,既然要做到「線性」,那麼每個數必須只能被篩一次
所以我們猜想,乙個合數只會被它的最小素因數篩去
memset(is_prime,1,sizeof(is_prime));
首先假設所有數都是素數
is_prime[1]=0;
確定$1$不是素數
for(int i=2;i<=n;i++)
列舉所有$[1,n]$區間內的數
if(is_prime[i])
prime[++tot]=i;
如果它在之前的篩選中「存活」下來,那麼它一定是個素數,把它加入素數列表
for(int j=1;j<=tot&&i*prime[j]<=n;j++)
列舉i
與乙個素數能組成的所有合數,注意不要讓它們超過n
is_prime[i*prime[j]]=0;
標記為合數
if(i%prime[j]==0)
break;
關鍵一步
如果i
可以有乙個素數因子,就跳出迴圈
為什麼呢?
我們先來看線性篩質數的規則:
乙個合數只會被它的最小素因數篩去
如果i
有別的素因數了,那麼堅強
證明它不是接下來的合數的最小素因數
所以為了保證執行效率,要跳出迴圈
$$ t(n) = o(n) $$
尤拉篩篩素數 - 學委的部落格
尤拉函式尤拉篩
尤拉函式求小於等於n與n互質的數的個數 複習時發現這個知識點竟然沒有整理 n為素數即為n 1 除了其本身 n為素數的倍數 ola sushu j i ola i sushu j else ola sushu j i ola i sushu j 1 include include include in...
線性篩(尤拉篩)
昨天的考試跪的一塌糊塗 第一題水過,第二題帶wa的樸素,最後題忘了特判左端點全跪,分數比起預計得分整整打了個對折啊!步入正題 線性篩 尤拉篩 一般的篩法 ppt裡叫埃拉託斯特尼篩法,名字異常高貴 的效率是o nlglgn 其實很接近o n 啊!對於一些例如n 10000000的殘暴資料會跪,於是,線...
尤拉篩 線性篩
實現 include using namespace std const int max n 1e8 int prime max n cnt bool st max n 使用bool陣列節省空間 void is prime int n intmain 每個合數只被自己最小的質因子篩去。現在證明在i ...