prime陣列中的素數是遞增的,當i能整除prime[j],那麼i*prime[j+1]這個合數肯定被prime[j]乘以某個數篩掉。因為i中含有prime[j],prime[j]比prime[j+1]小,即i=k*prime[j],那麼i*prime[j+1]=(k*prime[j])*prime [j+1]=k』*prime[j],接下去的素數同理。所以不用篩下去了。因此,在滿足i%prime[j]==0這個條件之前以及第一次滿足改條件時,prime[j]必定是prime[j]*i的最小因子。
bool vis[maxn];
int prime[maxn];
void isprime()
for(int j=0;j對於 i%prime[j] == 0 就break的解釋 :當 i是prime[j]的倍數時,i = kprime[j],如果繼續運算 j+1,i * prime[j+1] = prime[j] * k prime[j+1],這裡prime[j]是最小的素因子,當i = k * prime[j+1]時會重複,所以才跳出迴圈。
舉個例子 :i = 8 ,j = 1,prime[j] = 2,如果不跳出迴圈,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12時會計算。因為尤拉篩法的原理便是通過最小素因子來消除。
線性篩素數(尤拉篩)
尤拉篩是o n 複雜度的篩素數演算法,1秒內埃篩能處理1e6的資料,而1e7的資料就必須用尤拉篩了。埃篩的基本思想是 素數的倍數一定是合數。尤拉篩基本思想是 任何數與素數的乘積一定是合數 演算法概述 遍歷 2,n 的所有數i,內層迴圈遍歷已經找到的素數prime j 將i prime j 標記為合數...
素數線性篩法(尤拉篩)
之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...
尤拉篩法(線性篩素數)
以下內容 include include using namespace std intmain printf d n cnt return0 其中注釋為 關鍵!的句子的解釋大概如下 首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候...