zoukankan      html  css  js  c++  java
  • NOIP模拟题——素数密度

    问题描述

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

    输入数据

    两个数L和R

    输出数据

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

    样例输入

    2 11

    样例输出

    5

    L和R范围很大,但区间长度反而很小。

    考虑平移区间,将L和R的下标缩小(L是0,L+1是1……)

    筛法求素数

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstdlib>
     4 #include<cmath>
     5 using namespace std;
     6 const long long maxn=1e6+7;
     7 long long l,r;
     8 long long vis[maxn],q[maxn],temp;
     9 long long pd[maxn];
    10 void init()
    11 {
    12     long long qwe=sqrt(r+0.5);
    13     for(long long i=2;i<=qwe;i++)
    14     {
    15         if(vis[i]==true)continue;
    16         if(vis[i]==false)
    17         {
    18             q[++temp]=i;
    19             for(long long j=i;j*i<=qwe;j++)
    20             vis[j*i]=true;
    21         }
    22     }
    23     return ;
    24 }
    25 int main()
    26 {
    27     freopen("prime.in","r",stdin);
    28     freopen("prime.out","w",stdout);
    29     scanf("%I64d%I64d",&l,&r);
    30     long long len=r-l+1;
    31     init();
    32     for(long long i=1;i<=temp;i++)
    33     {
    34         long long kk=l/q[i];kk*=q[i];
    35         if(kk<=q[i])kk=2*q[i];
    36         if(kk<l)kk+=q[i];
    37         for(long long j=kk;j<=r;j+=q[i])
    38         pd[j-l+1]=true;
    39     }
    40     long long ans=0;
    41     for(int i=1;i<=len;i++)
    42     if(pd[i]==false)ans++;
    43     printf("%I64d",ans);
    44     return 0;
    45 }
  • 相关阅读:
    macos linux 命令行显示当前全路径方法
    mac 下面使用apidoc 使用
    du 统计文件夹大小
    mac 共享文件和mount挂载数据
    linux与linux、windows之间文件共享的几种方式
    Yaf安装和配置
    设计模式之 里氏替换原则
    设计模式之单一职责原则
    微信支付 遇到问题总结
    bash shell 快捷键
  • 原文地址:https://www.cnblogs.com/937337156Zhang/p/6073844.html
Copyright © 2011-2022 走看看