POJ 2689 区间筛选质数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

题目链接:http://poj.org/problem?id=2689
题意:
给定区间 [L,U] 中,求相邻两个质数的 最大(小)差值 所对应的质数
有多组 [L,U]。
规模(1<=L< U<=2,147,483,647,区间长度<1,000,000. )
类型:
经典的区间筛选质数
分析:
定理:所有的合数都可以拆分为n个质数的乘积
从L,U的大小(2的32次)明白:最大的质因子 < 2的16次。所以先打个质数表prime1。
根据质数表prime1,可以和方便地求出 [L,U]内的合数,进而打出第二张质数表prime2([L,U]内的质数)。
最后暴力扫一遍。

prime[0]存储质数的个数。
小心 L==1 时需要进行处理。
时间复杂度&&优化:
9064K 94ms
代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<algorithm>
#include<iostream>

using namespace std;

const int MAXN = (1<<16)+10;
const int inf = 1000000007;
const int mod = 1000000007;

int prime1[1<<17];///2^16内的质数表,prime1[0]是质数的个数

void getprime1(){///得到2^16内的质数表
    memset(prime1,0,sizeof(prime1));
    for(int i=2;i<=MAXN;i++){
        if(prime1[i]==0)prime1[++prime1[0]]=i;

        for(int j=1;j<=prime1[0]&&prime1[j]<=MAXN/i;j++){
            prime1[prime1[j]*i]=1;
            if(i%prime1[j]==0)break;///优化,2*k包括了4*k
        }
    }
}

int notprime2[1000000+10];///质数性表,notprime2[0]表示L+0的质数性,1表示非质数,0表示质数
int prime2[1000000+10];

void getprime2(int l,int r){
    memset(notprime2,0,sizeof(notprime2));///得到:质数性表
    for(int i=1;i<=prime1[0];i++){
        for(int j=(l-1)/prime1[i]+1;j<=r/prime1[i];j++){
            if(j>=2)notprime2[prime1[i]*j-l]=1;
        }
    }

    memset(prime2,0,sizeof(prime2));///得到:质数表
    for(int i=l-l;i<=r-l;i++){
        if(notprime2[i]==0){
            //cout<<i+l<<"@";
            prime2[++prime2[0]]=i+l;
        }
    }
}

int main()
{
    getprime1();
    int l,r;
    while(cin>>l>>r){
        if(l==1)l=2;
        getprime2(l,r);

        ///暴力
        if(prime2[0]<2){cout<<"There are no adjacent primes."<<endl;continue;}
        int maxx,minn,maxr,minr;
        maxx=0;minn=inf;
        for(int i=2;i<=prime2[0];i++){
            //cout<<prime2[0]<<" ";
            if(prime2[i]-prime2[i-1]>maxx){maxx=prime2[i]-prime2[i-1];maxr=prime2[i];}
            if(prime2[i]-prime2[i-1]<minn){minn=prime2[i]-prime2[i-1];minr=prime2[i];}
        }
        printf("%d,%d are closest, %d,%d are most distant.\n",minr-minn,minr,maxr-maxx,maxr);
    }

    return 0;
}
C++质数的那些事(判断指数、区间质数、互质等等) 质数的定义:若一个正整数除了1和它自身之外不能被任何自然数整除,则该数称为质数,也叫素数。否则为合数。质数的性质:质数的分布较为稀疏,对于一个足够大的数S,不超过S的质数大约有个,也就是说每InN个数约有一个质数,代码: 二、筛出给定区间质数 代码(欧拉筛(线性筛)): 三、判断两个整数是否互质 代码: 代码会随个人学习进行持续更新,谢谢您的观看! 阅读详情

相关推荐

数论——区间质数

关于质数部分的扩充讲解

qq_57150526的博客 1027

四种基本筛法(朴素法、埃氏筛、欧拉筛(线性筛)、区间筛法)

求素数的魅力就在于,他为编程与数学思想的组合。

2302_80067378的博客 1813

素数的区间筛法

区间筛法

m0_72542983的博客 854

C++区间质数筛选(2种方法)

本文介绍了两种C++实现区间质数筛选的方法:埃拉托斯特尼筛法和线性筛法。埃拉托斯特尼筛法通过标记倍数来筛选质数,时间复杂度为O(NloglogN),但存在重复标记问题。优化版本从i²开始标记可减少冗余计算。线性筛法则通过最小质因子保证每个合数只被标记一次,时间复杂度优化至O(N)。文章通过代码示例和图示对比了两种算法的实现原理和效率差异,指出线性筛法是更优选择。两种方法都能有效筛选出给定区间[min,max]内的所有质数

2403_87013629的博客 417

poj 2689 Prime Distance 素数

题目链接:http://poj.org/problem?id=2689 Prime Distance Time Limit:1000MS Memory Limit:65536K Total Submissions:27316 Accepted:7051 Description The branch of mathematics called n...

CharllotteQZY的博客 252

POJ2689-Prime Distance(区间素筛)

Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20161 Accepted: 5424 Description The branch of mathematics called number theory is about properties of numbers

swust5120160705的博客 267

poj 2689(质数)

题目地址 可以通过 R-L来寻找突破口, 对于任何一个合数都有不超过sqrt(n)的因子,所以我们可以筛出2~sqrt®的质数再通过这些质数将L-R中的所有非质数标记。最后直接枚举。 对于筛选出来的每一个质数p,它对应L-R区间的倍数为j*p(ceil(L/p) <= j <= R/p) 详细见代码 #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); //#include<bits/stdc++.h> #in

qq_45604735的博客 652

线性筛 + 埃式筛 (区间质数) - Prime Distance - POJ 2689

线性筛 + 埃式筛 (区间质数) - Prime Distance - POJ 2689 题意: 给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对。 同时,你还需要找到距离最远的两个相邻质数D1和D2(即D1-D2是最大的),如果存在相同距离的其他相邻质数对,则输出第一对。 输入格式 每行输入两个整数L和U,其中L和U的差值不会超过1000000。 输出格式 对于每个L和U ,输出一个结果,结果占一

njuptACMcxk的博客 298

POJ 2689 Prime Distance (素数+两次筛选

题目地址:http://poj.org/problem?id=2689 题意:给你一个不超过1000000的区间L-R,要你求出区间内相邻素数差的最大最小值,输出相邻素数。 AC代码:   #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;stri...

weixin_34310127的博客 118

区间筛+例题(POJ2689

区间筛   区间筛一般用于那种超大区间的素数筛选当中,例如我给你一个区间 [ l , r ],其中 l < r && r<=2 ^31, r - l<=10 ^ 6,这个时候我们已知的筛法不可能从2 ~ r去筛选,同时也不能从 l ~ r 去筛选(无法开这么大的数组,会爆)。那我们这个时候能够用什么去筛选呢?我们应该不难想到 r 中所有的合数的最小质因子一定是小于等于根号 r,那么我们可以先筛选 2 ~ 根号r 中的所有素数,然后去标记 l ~ r中所含的能够被整除2 ~

kitalekita的博客 827

POJ 2689 Prime Distance 素数线性筛选

题目大意 给定左右区间,求出区间内两个相邻质数中相差最大和最小的两队, 没有就输出 There are no adjacent primes. 范围 1 ≤ L < R ≤ 2^31−1 样例 输入样例: 2 17 14 17 输出样例: 2,3 are closest, 7,11 are most distant. There are no adjacent primes. 思路 &n...

正月看雪花的博客 476

区间素数筛选 POJ2689

题意: 给一个区间[L,U],(1 由于L,U都小于2^32,所以区间内的合数的最小质因子必然小于2^16,所以先筛出2^16以内的素数,用筛出来的素数去筛[L,U]内的合数。然后把[L,U]内的素数保存下来,再搜索最近和最远的素数对即可。注意两整数相乘可能溢出32位,注意对1的判断。 代码: #include #include #include #include

hexiecs的技术专栏 1171

Prime Distance - POJ 2689 素数筛选

题目链接 POJ 2689 Description The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of ye

呼,是出一口气;吸,是争一口气! 629

[数论] POJ 2689 Prime Distance 二次筛选

传送门:Prime Distance Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10930   Accepted: 2946 Description The branch of mathematics called

jjaw2013 865

POJ2689

题目 POJ2689 Prime Distance 原题传送门 主要思路 刚看到这题,心想:不就筛个 \(\left[2,U\right]\) 的质数表出来就可以了吗?一看数据范围: \(1<=L< U<=2147483647\) \(\cdots\) \(Woc\),这 \(TM\) 可以做吗?看来必须另辟蹊径了。于是就有了下面这个做法。 显而易见,一个数 \(x\) 如果不...

weixin_30871293的博客 139

Poj2689筛素数

Poj2689筛素数 题目大意: 给定一个区间l,r,求这个区间内相邻的质数中最近的两个和最远的两个.区间范围是1-2^31,区间的长度最多是10^6. 思路: 刚开始对筛选法的理解不深,不知道如何筛选任意一段区间的素数,看了题解恍然大悟,原来用的筛选法总是筛选从1-n的素数,对于为何这样筛选理解不深刻.说下1-n的筛选法,就是用一个数组...

weixin_30905133的博客 117

Prime Distance POJ - 2689 区间筛素数

区间筛素数。 类似埃筛的思想。 直接求1-R所有质数,打不下。 由于一个合数N,一定有一个不超过根号N的质因子。 所以我们只要用筛法求出 1 --- 根号R 的质数。 然后类比埃筛,标记L-R之间合数。//注意1不是质数。 然后把质数取出,求相邻质数差最大最小即可。 //KX //#include <bits/stdc++.h> #include<cstdio&...

bjfu170203101的博客 230

poj -- 2689 Prime Distance(筛选法求素数)

<br />Prime DistanceTime Limit: 1000MS Memory Limit: 65536K<br />Total Submissions: 5188 Accepted: 1384<br /><br /><br />Description<br />The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured th

蓝色污点的专栏 1292

POJ2689 Prime Distance

区间质数转换成区间和数的问题,看到区间只有1e6,所以任务是删去这个区间内所有合数。 每一个合数n最小质因子不会超过。 首先筛出(1e5)的所有质数,用他们去筛L到R的所有合数即可。 #include <iostream> #include <iostream> #include <cstring> #include <cmath> #d...

Luowaterbi的博客 159
上一篇: HDU 3790--最短路问题(Dijkstra)
下一篇: POJ 3255 图论基础 次短路
spring_3_shine
博客等级 码龄10年 21粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值