LightOJ 1197 Help Hanzo(区间素数筛)
题目大意
\(t\)个询问,每次问\([l,r]\)内有多少素数。
具体实现
区间素数筛选的模板题,先提前筛出来一组素数,然后再用埃氏筛选法对区间进行筛选,需要注意的是炸\(int\)以及左区间为\(1\)的情况。
代码
const int maxn = 1e6+10;
int p[maxn], kase;
bool u[maxn], isp[maxn];
void pri() {
for (int i = 2; i<maxn; ++i) {
if (!u[i]) u[i] = p[++kase] = i;
for (int j = 1; i*p[j]<maxn; ++j) {
u[i*p[j]] = p[j];
if (!(i%p[j])) break;
}
}
}
int main(void) {
pri();
int t, kase = 1;
scanf("%d", &t);
while(t--) {
int l, r;
scanf("%d%d", &l, &r);
zero(isp);
for (int i = 1; 1LL*p[i]*p[i] <= r; ++i)
for (ll j = l/p[i]*p[i]; j <= r; j += p[i])
if (j >= l && j > p[i]) isp[j-l] = true;
int ans = 0;
for (int i = l; i<=r; ++i)
if (!isp[i-l]) ++ans;
if (l==1) --ans; //如果是1开始的话没法被筛去,需要特判
printf("Case %d: %d\n", kase++, ans);
}
return 0;
}