藍橋杯-找素數【篩選法】
阿新 • • 發佈:2019-02-09
演算法提高 找素數
時間限制:1.0s 記憶體限制:256.0MB
問題描述
給定區間[L, R] , 請計算區間中素數的個數。
輸入格式
兩個數L和R。
輸出格式
一行,區間中素數的個數。
樣例輸入
2 11
樣例輸出
5
資料規模和約定
2 <= L <= R <= 2147483647 R-L <= 1000000
一般的方法會超時。。
陣列開小了,也會超時。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> using namespace std; const int MAX_L = 9999999; const int MAX_SQRT_B = 9999999; typedef long long ll; bool is_prime[MAX_L], is_prime_small[MAX_SQRT_B]; int sum = 0; void segment_sieve(ll a, ll b) { for (int i = 0; (ll)i * i < b; i++) is_prime_small[i] = true; for (int i = 0; i < b - a; i++) is_prime[i] = true; for (int i = 2; (ll)i * i < b; i++) { if (is_prime_small[i]) { for (int j = 2*i; (ll)j*j < b; j += i) is_prime_small[j] = false; for (ll j = max(2LL, (a+i-1)/i)*i; j < b; j += i) { is_prime[j-a] = false; } } } return; } int main() { ll a, b; cin >> a >> b; segment_sieve(a, b+1); for (ll i = a; i <= b; i++) { if (is_prime[i-a]) sum++; } printf("%d\n", sum); return 0; }