zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    SqlServer查询优化方法
    关于导入excel问题
    修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
    软件架构之我见
    算法-插入排序
    算法-快速排序
    WCF系列 Restful WCF
    WCF系列 基础概念
    cocos2dx-是男人就坚持20s 练手项目
    nodejs 聊天室简单实现
  • 原文地址:https://www.cnblogs.com/five20/p/9231418.html
Copyright © 2011-2022 走看看