LightOJ - 1197 Help Hanzo(区间素数筛)

26 篇文章 0 订阅
5 篇文章 0 订阅

Help Hanzo

题解:因为区间太大,所以我们需要考虑再仔细看一下题,求的是 [ a , b ] [a,b] [a,b]区间内的素数,并且 b − a ≤ 100000 b - a ≤ 100000 ba100000,因此我们可以借用素数筛的思想,将 [ a , b ] [a,b] [a,b]区间内的合数筛去。具体做法就是先找到区间[a,b]内的第一个合数

int t = prime[i] * ceil(1.0 * a / prime[i]);

(注意可能这个数是素数,需要判断一下)然后开始素数筛,最后枚举一下多少个素数即可。

代码

#include<bits/stdc++.h>

using namespace std;
const int N = 100100;
int prime[N];
bool vis[N];

int init()
{
    int k = 0;
    for(int i = 2; i < N; ++i) {
        if(vis[i] == 0)
            prime[k++] = i;
        for(int j = 2; j * i < N; ++j) {
            if(vis[i * j] == 0)
                vis[i * j] = 1;
        }
    }
    return k;
}

bool book[N];
int main() {
#ifndef ONLINE_JUDGE
    freopen("input.in", "r", stdin);
#endif
    int T, a, b, k = init(), w = 1;
    cin >> T;
    while (T--) {
        cin >> a >> b;
        memset(book, 0, sizeof book);
        for (int i = 0; i < k && prime[i] <= sqrt(b); ++i) {
            int t = prime[i] * ceil(1.0 * a / prime[i]);
            if (t % prime[i] == 0 && t != prime[i])
                book[t - a] = 1;
            for (int j = 1; j * prime[i] <= b - a; ++j) {
                int tmp = j * prime[i] - a + t;
                if (book[tmp] == 0)
                    book[tmp] = 1;
            }
        }
        int cnt = 0;
        for (int i = a; i <= b; ++i)
            if (book[i - a] == 0) {
                cnt++;
            }
        if (a == 1) cnt--;
        cout << "Case " << w++ << ": " << cnt << endl;
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值