• P1835 素数密度_NOI导刊2011提高(04)


    题目描述

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

    输入输出格式

    输入格式:

     

    两个数L和R。

     

    输出格式:

     

    一行,区间中素数的个数。

     

    输入输出样例

    输入样例#1: 
    2 11
    输出样例#1: 
    5

    Solution:

      本题比较模板()。

      因为$int_{max}$范围内的合数只需用$sqrt {int_{max}}leq 50000$内的质数就能筛出。

      于是,预处理出$50000$内的质数,然后埃式筛掉$[l,r]$范围内的合数就好了,随便瞎搞一下就好了。

      最后统计一下质数个数并输出。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define ll long long
    #define For(i,a,b) for(ll (i)=(a);(i)<=(b);(i)++)
    #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
    using namespace std;
    const int N=50005,M=1000005;
    int l,r,prime[N+5],cnt;
    bool isp[N+5],isprime[M+5];
    
    il void init(){
        For(i,2,N){
            if(!isp[i]) prime[++cnt]=i;
            for(int j=1;j<=cnt&&prime[j]*i<=N;j++){
                isp[prime[j]*i]=1;
                if(i%prime[j]==0)break;
            }
        }
    }
    
    il void solve(){
        ll p,q;
        For(i,1,cnt){
            if(prime[i]>r)break;
            p=ceil(l*1.0/prime[i]),q=ceil(r*1.0/prime[i]);
            if(p==1)p=2;
            for(int j=p;j<=q&&prime[i]*j<=r;j++)
                isprime[prime[i]*j-l+1]=1;
        }
        int tot=0;
        For(i,1,r-l+1) if(!isprime[i]) tot++;
        cout<<tot;
    }
    
    int main(){
        init();
        cin>>l>>r;
        solve();
        return 0;
    }
  • 相关阅读:
    线程同步锁的使用方式
    EventBus简单封装
    Dagger2不自动生成daggerXXXcomponent
    android mvp模式
    第八天
    单词统计续
    学习进度第十一周
    第七天
    第六天
    第五天
  • 原文地址:https://www.cnblogs.com/five20/p/9231418.html
Copyright © 2020-2023  润新知