【NOIP模拟】素数密度

Description

给定区间L,R(L<=R<=2147483647,R-L<=1000000),请计算区间中素数的个数。

Solution

我们发现R-L不是很大,我们可以直接用质数筛掉。
质数我为了防止不够开到100000。

要数组平移

我们发现数组直接搞会爆掉,我们存的时候数组平移一下,就是存i-n就可以了。

Code

#include
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int i,j,k,l,t,n,m,ans;
int zhi[100001];
bool bz[100001],az[1000005];
int read(){
    char ch=getchar();
    int x=0,f=1;
    while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')f=-1;}
    while (ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int main(){
    fo(i,2,sqrt(100000)){
        if(!bz[i]){
            fo(j,2,100000/i){
                bz[i*j]=1;
            }
        }
    }
    fo(i,2,100000)if(!bz[i])zhi[++zhi[0]]=i;
    n=read();m=read();
    fo(i,1,zhi[0]){
        fo(j,max(n/zhi[i],1),m/zhi[i]){
            if(j==1)continue;
            if(j*zhi[i]continue;
        //  if(zhi[i]*j)
            az[zhi[i]*j-n]=1;
        }
    }
    fo(i,n-n,m-n){
        if(!az[i])++ans;
    }
    printf("%d\n",ans);
}

你可能感兴趣的:(数论,noip)