尤拉篩 篩素數,附上一點解釋)

2021-09-02 02:39:51 字數 534 閱讀 2641

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e6 + 100;

ll n;

bool vis[maxn];

ll prime[100000];

int cnt;

void eular()

}}

最後的break是最關鍵的步驟,使得合數不會被多次排除,說一下我對這一步的理解(參考大佬的部落格):假如沒有這句的話。如果i %prime[j] == 0,也就是i = k * prime[j],那麼i * prime[j + 1] == k * prime[j] * prime[j + 1];隨著i的增大,一定會出現i == prime[j + 1] * k,當然也會出現prime[j + 1] * k * prime[j]這種情況,但是前面已經出現過一次了,所以就跳出迴圈,至於prime[j + 2],prime[j + 3].......等等也都是一樣的情況。

線性篩素數(尤拉篩)

尤拉篩是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 精髓在於...

素數線性篩 尤拉Euler篩

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 ...