模板 線性篩素數 尤拉篩法

2022-04-29 21:18:07 字數 692 閱讀 3245

$o(n)$處理出n以內所有素數

使用 合數=最大因數(除1和本身外)*最小質因數 的原理來篩,每個數隻會被篩一次

對於每個數i,令它是某數的最大因數,然後從小到大地找<=i的素數j,則i*j是合數

直到找到某個j使得$i\%j==0$,因為再往後的話,j'> i的某個因子,我們能交換j'和i的這個因子,所以i不是i*j'的最大因數(或者說i*j'的最小質因數是剛才的那個j),再往後做沒有意義

luogu3383

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int maxn=10000010;7

8int

rd()

13while(c>='

0'&&c<='

9') x=x*10+c-'

0',c=getchar();

14return x*neg;15}

1617

intn,m;

18int

pri[maxn],cnt;

19bool

isp[maxn];

2021

intmain()31}

3233

for(i=1;i<=m;i++)

37 }

素數線性篩法(尤拉篩)

之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...

線性(尤拉)篩法篩素數表

乙個合數可以表示成乙個素數和乙個其他數的乘積,即假設有合數a,那麼一定存在這樣的a b c,其中b和c 有乙個為素數,由此得到以下的方法,從2 maxn迴圈一遍,每次篩掉 i 與素數表每一項的乘積,最終剩下的就是素數。include include using namespace std const...

線性篩素數(尤拉篩)

尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...