problem:找出小於等於n的所有素數的個數。
#include using namespace std;
const int maxn = 1e6;
int prime[maxn]; // 尤拉線性素數篩,o(n)
bool vis[maxn]; // 標記
int prime(int n)
}return cnt;
}int main()
解釋:首先,任何合數都能表示成多個素數的積。所以,任何的合數肯定有乙個最小質因子。我們通過這個最小質因子就可以判斷什麼時候不用繼續篩下去了。
當i是prime[j]的整數倍時(i % prime[j] == 0),i*prime[j+1]肯定被篩過,跳出迴圈。
因為i可以看做prime[j]*某個數, i*prime[j+1]就可以看做 prime[j]*某個數*prime[j+1] 。而 prime[j] 必定小於 prime[j+1],
所以 i*prime[j+1] 必定已經被 prime[j]*某個數 篩掉,就不用再做了√
同時我們可以發現在滿足程式裡的兩個條件的時候,prime[j]必定是prime[j]*i的最小質因子。這個性質在某些題裡可以用到。
解釋**
線性素數篩(尤拉篩)(超級好的MuBan)
problem 找出小於等於n的所有素數的個數。include using namespace std const int maxn 1e6 int prime maxn 尤拉線性素數篩,o n bool vis maxn 標記 int prime int n return cnt int main...
線性篩素數(尤拉篩)
尤拉篩是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 精髓在於...