素数统计

sloj P4006. 素数统计

题目描述

统计区间[a,b]范围内素数的数量。

输入格式

输入一行两个正整数a和b,表示给定区间为[a,b]。

输出格式

输出一个整数,表示区间内素数数量。

样例

输入数据 1

1 17

输出数据 1

7

数据规模与约定

对于30%的数据,有n<m≤1,000;

对于60%的数据,有n<m≤1,000,000;

对于100%的数据,有n<m<2^31,m-n≤1,000,000

 我们可以发现这题明显是不能直接算1~r的范围的,也很明显的是只算l~r区间是会错的

肯定会T,第二个嘛,自己想想线性筛原理应该就能明白

这是我们就可以想一想线性筛标记合数的原理,很明显,最小质(只)因子乘上当前数时,设x为他们俩的乘积,质因子一定小于√x

同样,证明就不放了,很显然嘛

所以我们只用筛2~√r的部分

 上代码

#include<bits/stdc++.h> 
#define ll long long
using namespace std;
int prime[1000010],pr[1000010],vis[1000010];
ll l,r,ans = 0,cnt;
void pre(){
    for(int i = 2;i<=1000010;i++){
        if(!vis[i]) prime[++cnt] = i;
        for(int j = 1;j<=cnt&&prime[j]*i<=1000010;j++){
            vis[i*prime[j]] = 1;
            if(i%prime[j]==0) break;
        }
    }
}
int main(){
    pre();
    scanf("%lld%lld",&l,&r);
    for(ll i = 1;i<=cnt;i++)
        for(ll j = max(1ll,(l-1)/prime[i])*prime[i]+prime[i];j<=r;j+=prime[i])
            pr[j-l] = 1;
    for(ll i = max(2ll,l);i<=r;i++)
        ans+=pr[i-l]?0:1;
    printf("%lld",ans);
    return 0;
}

 

posted @ 2022-12-02 21:30  cztq  阅读(74)  评论(0)    收藏  举报