線性時間篩素數

2022-05-05 06:12:07 字數 705 閱讀 3418

**:yinthewind的部落格

這兩天看到了線性時間篩選素數,覺得它的擴充套件很神奇= =

先來基本的

#define n 10000000

int prime[n],p;

bool iscomp[n+1];

void primetable()

for(int j=0;jcnt[i]的值即為 i 的素因子個數.

求因子的個數:

#include

#define n 1000010

using namespace std;

int prime[n],p;

int cnt[n];

int div[n];

bool iscomp[n];

void primetable4()

for(int j=0;j

後記:結合線性篩素數演算法的優化演算法

基於這個線性篩素數演算法,我們可以很容易地得到某個數的最小素因子。

因為當i%pr[j]!=0的時候,最小素因子pr[j]與i互質,滿足積性函式的條件,可以直接得到f(i*pr[j])=f(i)*f(pr[j]).

不過當i%pr[j]==0時我們必須根據該積性函式本身的特性進行計算.或者在篩的同時儲存並遞推些附加資訊.總之要o(1)求得f(i*pr[j])及完成遞推附加資訊.

上面介紹的兩個則是最常用的,其實還可以有很多擴充套件,這裡就不談了....

素數篩法(素數篩 線性篩)

求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...

素數線性篩

ps 證明 神牛部落格。include include using namespace std const int n 100100 int v n p n n,m,tot int main 首先,先明確乙個條件,任何合數都能表示成一系列素數的積。不管 i 是否是素數,都會執行到 關鍵處1 如果 i...

線性篩素數

如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。in...