B - Help Hanzo (LightOJ - 1197)
阿新 • • 發佈:2018-02-14
全部 ret 一個 區間 ons ems 思路 由於 cas
- 題目大意
在一個區間中去尋找素數的個數。
- 解題思路
由於a,b的取值範圍比較大,無法把這個區間內的所以素數全部篩選出來,但是b-a這個區間比較小,所以可以用區間素數篩選的辦法解決這個題目。
- 代碼
#include<iostream> #include<cmath> #include<cstring> using namespace std; const int MAX = 1e6 + 5; bool vis[MAX],vis2[MAX]; int cnt = 0; int p[MAX]; void num() { memset(vis, 0, sizeof(vis)); vis[1] = 1; for (int i = 2; i <MAX; i++) { if (!vis[i]) { p[cnt++] = i; for (long long j = i*2; j <= MAX; j += i) { vis[j] = 1; } } } } int main() { long long n, a, b; cin >> n; num(); for (long long i = 1; i <= n; i++) { long long sum = 0; cin >> a >> b; if (b <= MAX - 1) { for (long long i = a; i <= b; i++) { if (!vis[i]) sum++; } } else { memset(vis2, 0, sizeof(vis2)); for (int i = 0; i<cnt&&p[i] <= b; i++) { long long k = a / p[i]; if (k*p[i]<a) k++; for (long long j = k * p[i]; j <= b; j += p[i]) { vis2[j - a] = 1; } } for (long long i = a; i <= b; i++) { if (!vis2[i - a]) sum++; } } cout << "Case " << i << ": "; cout << sum << endl; } return 0; }
B - Help Hanzo (LightOJ - 1197)