poj 3292 艾氏篩法的變型

2021-07-31 05:34:55 字數 1540 閱讀 5080

題意:

有一種數叫h-number,什麼是h-number,就是等於4*n+1的數,所有的h-number  mod  4 等於 1。

h-number分為h-prime和h-composite兩類,h-prime是不能被自己和1以外的其他h-number

整除的數。剩下的就都是h-composite數了。

注意,9是h-prime,

雖然9在自然數中能被3整除,但是在h-number中,它只能分解成1*9,因為3不是

h-number。

現在,題目又給出一種數,叫h-semi-prime,首先它是乙個h-number,即滿足 mod 4等於1。

其次,它是恰好兩個h-primes的乘積。

如25 = 5*5,125 = 5*5*5,所以25是h-semi-prime,而125不是。

如今題目給乙個任意的屬於h-number的數h,h<=1000001,求從1到h的h-number中,屬於h-semi-primes的數的個數。

1.變型艾氏篩法打表,找出所有h-prime。

如果i是h-prime,那麼5*i+4*i*x(x>=0)一定不是h-prime。

ps:這是看的別人的解知道的。。。

出處:

2.得到滿足題目範圍的h-prime的兩兩乘積。

mul = h-prime[i]*h-prime[j]

3.h-semi-primes[mul] 表示從1到mul中所有的h-semi-prime的個數

寫個迴圈搞定

注意資料大小,注意資料大小,注意資料大小

(mul)

下面是**:

#include#include#includeusing namespace std;

typedef unsigned long long ull;

const int maxn = 1000005;

int h_prime[maxn];

bool is_h_prime[maxn];

int h_semi_prime[maxn];

int p;

//打表變型,如果i是h-prime,那麼5*i+4*i*x不是h-prime。

void sieve() }}

void get_semi_prime_h()

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

}int main() {

int h;

p = 0;

sieve();

get_semi_prime_h();

while(cin>>h&&h!=0) {

cout<

這裡給出類似的稍有不同的解法,可以對比多加思考

艾氏篩法研究

計算輸出1億以內的質數.當然一上來這個所有的偶數乾掉.2直接輸出.這個是我的 最後步長330130093 也就是這麼多步.下面的是老師的 步長99151769 初步計算速度是我的三倍.姜還是老的辣.我的其實還有優化的空間.暫時不去想了.備考去.include stdio.h include math...

埃氏篩法 素數的快速篩選

埃氏篩法的的核心是 素數的倍數都不是素數。那我們執行這樣乙個策略,我們可以確定的是 2 是最小的素數,建立乙個表並將除了 0 1 外的所有數標記為素數,我們將篩選範圍內的 2 的倍數全部標記為合數 非素數 然後取出表中最小的素數,執行相同的策略 講素數的倍數標記為非素數 下圖可以完美的演示這樣乙個演...

素數的快速篩選(埃氏篩法)

要列舉n以內的素數,可以用埃氏篩法。這是乙個與輾轉相除法一樣古老的演算法。首先,將2到n範圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都劃去。表中剩餘的最小數字是3,它不能被更小的數整除,所以是素數。再將表中所有3的倍數全都劃去。依次類推,如果表中剩餘的最小數字是m時,m就是素數...