素數與線性篩選法初級版

2021-06-16 20:35:29 字數 1663 閱讀 7786

今天我們來學習一些關於素數和線性篩選法的知識,這類問題在acm-icpc中常常遇到,所以很有必要學好它。

首先,來看素數篩選的乙個題。

題目:

題意:給定區間

分析:費馬平方和定理知道,乙個奇素數

只需要先篩選出所有素數,然後乙個乙個判斷即可,但是這個區間可能很大。普通的素數篩選法是用bool

組,佔乙個位元組空間,這樣很耗費記憶體,實際上在c++中有乙個神器叫做bitset,它是以位為單位的。

**:

#include #include #include #include using namespace std;

const int n = 300000005;

bitsetprime;

void work(int l,int r)

}int cnt = (l <=2 && 2 <= r);

for(int i=5; i<=r; i+=4)

if(i >= l && prime[i]) cnt++;

cout<>l>>r;

work(l,r);

return 0;

}

題目:

題意:

輸入乙個正整數

分析:可以先用線性篩選法求出

**:

#include #include #include using namespace std;

const int n = 1000005;

int sum[n];

bool ok[1005];

void init()

int k = -1;

for(int i=1; i= a)

}if(k == -1) puts("-1");

else printf("%d\n",p[k] - b);

}return 0;

}

題目:

題意:給定乙個數,求它的最大素因子在素數表中排列第幾。

分析:由於輸入很多,所以用篩選法預處理。

**:

#include #include #include using namespace std;

const int n = 1000005;

int rank[n];

void init()

for(int i=1; i<=max; i++)

}for(int i=1; i<=n; i++)

}int main()

線性篩選素數法

pri 1到pri n遞增,composite num1 n 在遍歷 1,n 的數時,剛好maxdivisor1 pri 3 pri 4 pri n 1 pri n。pri 1是是它最小的質因數。maxdivisor如果乘以乙個大於pri 3的質因數,例如pri 4,就找到另乙個合數 composi...

素數判斷與素數篩選法

方法一 直接判斷,思想簡單,實現比較簡單,但是複雜度過高bool isprime int a return true 方法二 素數篩選法 eratosthenes 篩法 只有素數才能當篩子 篩掉對應的倍數,不超過要求的範圍即可 遍歷一遍 void getprime int n 從i i開始計算 j ...

素數線性篩選

include include includeusing namespace std bool isprime 10000001 int pri 2000001 prin int findprime int maxn for int j 0 jmaxn break 當過大了就跳出 isprime i...