zoukankan      html  css  js  c++  java
  • 数论_埃氏筛法(求区间内多少素数)

    埃拉托斯特尼(公元前276—公元前194)


    埃拉托斯特尼是古希腊著名的数学家、地理学家、天文学家。他先在亚历山大港学习,后又转至雅典。公元前236年,托勒密三世指定他为亚历山大图书馆的图书管理员和馆长。他跟阿基米德是好朋友。埃拉托斯特尼的主要贡献包括:

    埃拉托斯特尼筛法:寻找素数的方法。

    地理常数测量:日地间距的测量(现在称一个这样的距离为一个天文单位)、地月间距的测量、测量赤道与黄道之间的偏角、地球半径测量等。

    精确地图绘制:当时只有托勒密等级的人物能绘出同等级的地图。

    算法数学原理:
    埃拉托斯特尼筛法是快速筛选素数的算法,在处理大量整数是否是素数时有较高的效率。

    例:筛选小于n的整数并记录结果。

    解:计算sqrt(n),∵对于任意的z<n,若z为合数,不妨设z=a*b,则必有min(a,b)<sqrt(n)

    ∴所有小于n的合数均可被小于sqrt(n)的整数整除

    从2开始,依次去除小于n的整数中能被其整除的数,最后剩下的就是素数

    int prime[maxn];
    bool is_prime[maxn];//is_prime[i]是true表示i是素数
    //返回n以内素数的个数
    int sieve(int n)
    {
        int p=0;
        for(int i=0;i<=n;i++) is_prime[i]=true;
        is_prime[0]=is_prime[1]=false;
        for(int i=2;i<=n;i++){
            if(is_prime[i]){
                prime[p++]=i;
                for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
            }
        }
        return p;
    }
    

      例题:洛谷 P1865  ,

    codevs3223 素数密度

    [a,b]的素数,只需要

    [2,b√]
    的素数表即可。这样我们可以筛出这些素数,然后用这些素数筛[a,b]。

    注意,j=max(2ll,(l+i-1)/i)*i的意思:

    (l+i-1)/i表示大于等于a的i的倍数的最小值。
    2则是普遍的i的倍数的最小值,一定不能小于2。
    再乘i,j就可以枚举[a,b]之间的合数了。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int SIZE=1000010;
    bool vis[SIZE];
    bool pri[SIZE];
    typedef long long LL;
    int main()
    {
        LL l,r;
        scanf("%lld%lld",&l,&r);
    
        for(LL i=2;i<=sqrt(r);i++)
        {
            if(!vis[i])
            {
                for(LL j=i*i;j<=sqrt(r);j+=i) vis[j]=1;
    
                for(LL j=max(2ll,(l+i-1)/i)*i;j<=r;j+=i) pri[j-l]=1;  
            }
        }
        int ans=0;
        for(int i=0;i<=r-l;i++) if(!pri[i]) ans++;
        printf("%d",ans);
    
        return 0;
    }
    

      

  • 相关阅读:
    MySQL学习(十二)
    MySQL学习(十一)
    MySQL学习(十)
    MySQL学习(九)
    MySQL学习(八)
    hlg1600线性代数中的矩阵问题【区间dp】
    HDU1556Color the ball【标号法||树状数组】
    hlg1481 Attack of the Giant n-pus【二分+二分图】
    0918
    20140913
  • 原文地址:https://www.cnblogs.com/passion-sky/p/10087034.html
Copyright © 2011-2022 走看看