題意:
有一種數叫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就是素數...