区间筛法

标签: esieve
15人阅读 评论(0) 收藏 举报
分类:

区间[a,b)指的是所有满足a<=x<b的整数(跟据背景也可能是实数)所构成的集合。

b以内的合数的最小质因数一定不超过根号b。如果有根号b以内的素数表的话,就可以把挨式筛选法运用到[a,b)上了,也就是说,先分别做好[2,根号b)的表和[a,b)的表,然后从[2,根号b)的表中筛得素数得同时,也将其倍数从[a,b)的表中划去,最后剩下的就是[a,b)的素数了。

#include<iostream> 
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long ll;

const int maxn = 1000005;

bool is_prime[maxn];//下标偏移 
bool is_prime_small[maxn];
ll prime[maxn];
ll prime_num=0;

void segment_sieve(ll a,ll b) {
    for(ll i=0;i*i<b;++i) is_prime_small[i]=true;//0~sqrt(b) 
    for(ll i=0;i<b-a;++i) is_prime[i]=true;//a~b->0~b-a

    for(ll i=2;i*i<b;++i) {
        if(is_prime_small[i]) {
            for(ll j=2*i;j*j<b;j+=i) is_prime_small[j]=false;
            //2LL是2的长整型形式
			//((a+i-1)/i)*i)是满足>=a&&%i==0的离a最近的数
			//也可以写成(a%i==0)?a:(a/i+1)*i
            for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;
        }
    }
    for(ll i=0;i<b-a;++i) 
        if(is_prime[i]) prime[prime_num++]=i+a;
}	

int main()
{
    ll a,b;
    while(~scanf("%lld%lld",&a,&b))
    {
        prime_num=0;
        memset(prime,0,sizeof(prime));
        
        segment_sieve(a,b);
        
        for(ll i=0;i<prime_num;++i) printf("%lld\n",prime[i]);
        printf("%lld\n",prime_num);
    }
    return 0;
}

查看评论

Office365 Exchange Online系列之邮箱大管家必学视频课程

本课程通过实践案例使学员对入站IP筛选管理、恶意软件筛选、入站垃圾邮件筛选、发送邮件安全策略和SPF/DKIM设置有一定的了解,帮助系统管理员轻松应对企业邮箱安全管理的日常工作,为企业的正常工作保驾护航。(没有配套学习资料,视频学习)
  • 2018年04月03日 10:36

POJ 2689 Prime Distance(素数区间筛法--经典题)

大致题意:给定[L,R]区间,找出区间内的每个素数 数据范围 : 1 R-L 1,000,000. R的数值太大,所以不能直接筛[0,R]的,要空间和时间优化,用到区间筛法,另外注意不能用int,因...
  • kalilili
  • kalilili
  • 2015-04-03 23:26:14
  • 1321

POJ-2689 Prime Distance,区间素数筛法

Prime Distance     只会埃氏筛法的弱鸡今天读了读挑战程序设计120页,明白了求小区间内素数的方法。     突然发现挑战真的是本很好的书,很具有引导性,不过很多地方没...
  • NYIST_TC_LYQ
  • NYIST_TC_LYQ
  • 2016-11-21 22:50:07
  • 573

(扩展)欧几里得算法、素性测试、埃式筛法、区间筛法、快速幂运算

来自挑战程序设计竞赛2.6 数学问题的解题窍门 1.素数测试 //素性测试O(√n) bool is_prime(int n) { for(int i=2;i*i...
  • qq_33929112
  • qq_33929112
  • 2016-08-15 19:34:10
  • 689

艾氏筛法判别素数

  • 2008年01月02日 12:46
  • 529B
  • 下载

埃氏筛法、区间筛法(求素数个数)

1、埃氏筛法        给定整数n,请问n以内有多少个素数?(n≤106)思路:首先,将2到n范围内的所有整数写下来。其中最小的数字2是素数。将表中所有2的倍数都划去。表中剩余最小的数字是3,它不...
  • zzti_xiaowei
  • zzti_xiaowei
  • 2018-02-15 12:05:52
  • 46

POJ 2689 Prime Distance(大区间素数筛法,两次筛法)

题目链接:http://poj.org/problem?id=2689 题意:求一个区间 [L,U] 内的差值最大的和差值最小的相邻素数对。(1 题解: 维基百科:埃拉托斯特尼筛法 单纯打表是不行的,...
  • u011523762
  • u011523762
  • 2016-03-14 00:31:03
  • 1167

素数的区间筛法

#include #include #include #include #include using namespace std; typedef long long ll; const i...
  • zhaiqiming2010
  • zhaiqiming2010
  • 2017-03-29 22:05:24
  • 94

数论基础题目八题【欧几里得】【筛法素数】【中国剩余定理】

数论前期基础题目八道。
  • u010468553
  • u010468553
  • 2014-08-06 16:51:53
  • 904

poj 2689 Prime Distance 筛法/二次筛法/区间素数

完全可以用二次筛法来做,虽然我只是一遍就筛出来,第一次,先找出[1,sqrt(INT_MAX+0.5)]间的素数。 第二遍利用第一遍找出的素数找出[L,U]内的素数,映射到一个数组里面,。 ...
  • yskyskyer123
  • yskyskyer123
  • 2016-03-15 13:33:48
  • 240
    个人资料
    持之以恒
    等级:
    访问量: 6666
    积分: 2832
    排名: 1万+
    文章存档
    最新评论