jushdi 2022-11-08 18:22 采纳率: 62.5%
浏览 18

洛谷P1835素数密度

img

img

为什么划线那里要这么写,不管2可不可以?想了半天不明白,但是一输10000 20000就输出0了?

  • 写回答

1条回答 默认 最新

  • honestman_ 2022-11-08 18:25
    关注
    
    #include <bits/stdc++.h>
    using namespace std;
    int l,r,now=1;
    int prime[50000],isprime[50010];
    void build(){
        isprime[1]=0;
        for(int i=2;i<50000;i++){
            if(isprime[i]){
                prime[now++]=i;
            }
            for(int j=1;j<=now&&i*prime[j]<50000;j++){
                isprime[i*prime[j]]=0;
                if(i%prime[j]==0) break;
            }
        }
    }
    int res[1000010],ans=0;
    int main(){
        cin>>l>>r;
        memset(isprime,1,sizeof(isprime));
        build();
        memset(res,1,sizeof(res));
        for(int i=1;i<now&&prime[i]<=r;i++){
            for(long j=max(2,(l-1)/prime[i]+1);j*prime[i]<=(long)r;j++){
                res[j*prime[i]-l]=0;
            }
        }
        if(l<=1) res[1-l]=0;
        for(int i=0;i<=r-l;i++){
            if(res[i]) ans++;
        }
        cout<<ans;
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 11月8日