埃式篩法是第乙個比較先進的篩法,以後的所有篩法大多都是以埃篩為基礎推進的
埃篩的思想也很簡單,篩掉所以素數的倍數,最後還剩的就是素數
bool isprime[maxn]
;void
eratosthenes_prime()
}
這個篩法的唯一缺陷是被重複篩去的元素太多,導致演算法不夠精妙
比如6會被2篩一次,還會被3篩一次,這就導致埃篩的時間只能達到o(nlogn),這樣的複雜度對付小資料,要是來個1e6是絕對不可能過的
再這之上,尤拉篩法就出現了,它避免了重複篩這一情況
bool isprime[maxn]
;int prime[maxn/10]
,tot;
void
euler_prime()
}}
尤拉篩唯一亮點所在在於if(i%prime[j]==0)break;這句,是從埃篩提公升到尤拉篩的關鍵
尤拉篩的時間是o(n)。
上面這個歐篩中的isprime陣列其實是作用不大的,我們可以把它換成尤拉函式,適當的我們也可以新增莫比烏斯函式
int prime[maxn/10]
,phi[maxn]
,mu[maxn]
,tot;
void
euler()
for(
int j=
0;j*i) phi[i*prime[j]
]=phi[i]
*(prime[j]-1
);mu[i*prime[j]]=
0;}}
}
除此之外,比較先進的素篩演算法還有min_25篩,杜教篩,洲閣篩
三種篩法時間都在o(n)之下,有些出題人就喜歡把資料故意整到1e10,就看你會不會這三種先進篩法
埃氏篩 尤拉篩
對於1 n範圍內素數的查詢,我們常用的二重迴圈暴力演算法的複雜度是o n2 如果利用開根縮小範圍的時間複雜度也無非是在o n nn sqrt n nn 而,這些演算法對於n在105以內都是可以接受的,但是如果需要更大範圍的素數表,這些演算法將顯得力不從心。下面將介紹更加高效的演算法。埃氏篩也叫素數篩...
埃氏篩 線性 尤拉 篩
埃氏篩 簡單,暴力。int isprime 50000 void getlist int size 看似簡單,但不真搞明白這個,無法學會線性 尤拉 篩。關鍵在於如何去做的合數,用了兩個引數,乙個是質數,即 prime i 另乙個是質數的倍數,即 j 相乘得到合數。線性篩 埃氏篩的改良版,使乙個合數只...
埃式篩與尤拉篩
核心思想 每個質數的倍數都是合數,當發現乙個質數時就將其的倍數都變成合數。缺點 有的合數會被它的幾個質因子重複篩掉,造成了時間上的浪費。include include using namespace std int n,q,cnt,k bool isprime 100000005 int sushu...