P1835 素数密度

题目:click
题意:求l-r中的素数个数。

区间筛,由于l-r中的合数的最小质因数不会大于sqrt( r ),预先处理出sqrt( r )的素数做区间筛。

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
const int MAX=1e6+10;
int l,r,tot=0;
bool vis[MAX];
bool num[MAX];
int prime[MAX];
void init()
{
    memset(vis,false,sizeof(vis));
    vis[1]=vis[0]=true;
    for(int i=2;i<MAX;i++)
    {
        if(!vis[i])
        {
            prime[tot++]=i;
        }
        for(int j=0;j<tot;j++)
        {
            if(i*prime[j]>=MAX)
                break;
            vis[prime[j]*i]=true;
            if(i%prime[j]==0)
                break;
        }
    }
}
int main()
{
    init();
    memset(num,false,sizeof(num));
    scanf("%d %d",&l,&r);
    for(int i=0;i<tot&&prime[i]*prime[i]<=r;i++)
    {
        for(ll j=(l/prime[i])*prime[i];j<=r;j+=prime[i])
        {
            if(j>=l&&j!=prime[i])
            {
                num[j-l]=true;
            }
        }
    }
    int ans=0;
    for(int i=0;i<=r-l;i++)
        if(!num[i])
            ans++;
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/106542873