区间埃筛
2026-09-01 19:52:56
发布于:四川
3阅读
0回复
0点赞
我们可以发现L,R过大,可R - L 只有1e6
所以区间筛
废话不多,上代码
#include <iostream>
#include <cmath>
using namespace std;
bool is_s[1000005], is_seg[1000005];
int sp[1000005], sc = 0;
int main() {
long long L, R;
cin >> L >> R;
int lim = sqrt(R) + 1;
for (int i = 2; i <= lim; ++i) {
if (!is_s[i]) {
sp[sc++] = i;
if ((long long)i * i <= lim)
for (int j = i * i; j <= lim; j += i) is_s[j] = 1;
}
}
int len = R - L + 1;
for (int i = 0; i < len; ++i) is_seg[i] = 1;
for (int k = 0; k < sc; ++k) {
long long p = sp[k];
long long start = L % p ? L + p - L % p : L;
if (start < p * 2) start = p * 2;
for (long long j = start; j <= R; j += p) is_seg[j - L] = 0;
}
int cnt = 0;
for (int i = 0; i < len; ++i)
if (is_seg[i] && L + i != 1) cnt++;
cout << cnt << endl;
return 0;
}
这里空空如也







有帮助,赞一个