LightOJ 1197 Help Hanzo(区间素数筛)

题目链接OvO

题目大意

  \(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;
}
posted @ 2020-04-29 18:12  shuitiangong  阅读(132)  评论(0编辑  收藏  举报