码迷,mamicode.com
首页 > 其他好文 > 详细

【codevs3223】素数密度

时间:2017-10-26 19:59:06      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:class   mes   cst   因此   质因数   lld   int   pac   sqrt   

这个题很明显直接从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】素数密度

标签:class   mes   cst   因此   质因数   lld   int   pac   sqrt   

原文地址:http://www.cnblogs.com/Loi-dfkdsmbd/p/7738585.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!