codevs3223素数密度

Posted 那一抹落日的橙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs3223素数密度相关的知识,希望对你有一定的参考价值。

这个题很明显直接从1-n筛出所有的素数是不现实的,因为数据范围是int的极限,o(n)也做不了

因此我们考虑区间筛,利用一个数最小的质因数一定在sqrt(i)以内的性质,筛出1-sqrt(n)以内的素数同时,去筛n-m到n的素数

#include<iostream>
#include<cstdio>
using namespace std;
long long l,r,ans;
bool f1[1000010],f2[1000010];
inline void ask(long long a,long long b)
{
    for(long long i=2;i*i<=b;i++)//枚举因数 
    {
        if(!f1[i])//如果这个数是质数(因为之前会把i以内的所有质数筛出来) 
        {
            for(long long j=2*i;j*j<=b;j+=i)
                f1[j]=1;//筛sqrt(b)以内的数,以便于筛更大的数 
            for(long long j=max(2LL,(a+i-1)/i)*i;j<=b;j+=i)//LL是用来强转longlong,(a+i-1)/i*i是为了找到a-b内i的最小倍数 
                f2[j-a+1]=1;
        }
    }
    for(long long i=1;i<=b-a+1;i++)
        if(!f2[i])
            ans++;
}
int main()
{
    scanf("%lld%lld",&l,&r);
    ask(l,r);//区间筛 
    printf("%d",ans);
}

 

以上是关于codevs3223素数密度的主要内容,如果未能解决你的问题,请参考以下文章

codevs 2964公共素数因数

codevs——1430 素数判定

codevs 5790 素数序数

codevs1430 素数判定

素数筛 codevs 1675 大质数 2

codevs 2945 计算素数