题目链接:点击查看

题目大意:给出一段闭区间[l,r],求区间内相邻距离最大的素数对和相邻距离最小的素数对,题目保证r-l<=1e6,1<=l<=r<=

题目分析:因为我们要求区间[l,r]内的最近和最远素数对,肯定要求出这段区间内的所有素数,l和r最大都能到1e9,并且其区间也到了1e6,暴力打表然后暴力遍历肯定是不行的,我们可以换一个思路,先在sqrt(1e9)的范围内打个素数表,这个用欧拉线性筛就能搞定,然后正难则反,我们最终要求的是所有素数,那么我们只需要将区间内的合数筛掉即可,合数的定义就是除了被1和自身整除外还有其他的质数所整除的数,那么我们可以在跑出来的素数表中遍历每一个素数,将该素数能在区间内组成的所有合数都筛掉,最后至多用1e6的时间复杂度跑一遍就能跑出最大值和最小值了

对了,为了方便处理,我在更新vis区间的时候将[l,r]区间向左偏移至原点,这样就变成了[0,1e6],方便处理,最后在输出答案时记得将答案都加上左区间即可

代码实现很清晰,欧拉线性筛也是从以前做的题目中直接复制的板子,更多的看注释吧,上代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e6+100;bool book[N];int cnt=0;int pri[N];bool vis[N];void P()//欧拉筛
{for(int i=2;i<N;i++){if(!book[i])pri[cnt++]=i;for(int j=0;j<cnt&&pri[j]*i<N;j++){book[pri[j]*i]=true;if(i%pri[j]==0)break;}}
}int main()
{
//  freopen("input.txt","r",stdin);P();//预处理打个素数表LL l,r;while(scanf("%lld%lld",&l,&r)!=EOF){memset(vis,false,sizeof(vis));for(int i=0;i<cnt;i++){LL a=(l+pri[i]-1)/pri[i];LL b=r/pri[i];for(LL j=max(a,2LL);j<=b;j++)//筛掉[l,r]内因子含有pri[i]的合数vis[pri[i]*j-l]=true;}if(l==1)//注意1不是素数,所以需要筛掉,记得特判一下vis[0]=true;int mark=-1;int x1,y1;//mmaxint x2,y2;//mminint mmax=-inf;int mmin=inf;for(int i=0;i<=r-l;i++){if(vis[i])//若当前的数为合数,则直接跳过continue;if(mark==-1)//若当前为区间内的第一个素数,不做处理{mark=i;continue;}if(i-mark>mmax)//更新最大值{mmax=i-mark;x1=mark;y1=i;}if(i-mark<mmin)//更新最小值{mmin=i-mark;x2=mark;y2=i;}mark=i;}if(mmin==inf)//若连最小值或最大值都没法更新,说明区间内的素数少于2个,直接输出printf("There are no adjacent primes.\n");else//否则输出答案printf("%lld,%lld are closest, %lld,%lld are most distant.\n",x2+l,y2+l,x1+l,y1+l);//答案记得加上左区间}return 0;
}

POJ - 2689 Prime Distance(素数区间筛模板)相关推荐

  1. Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho

    随机化算法,想尝试自己写一下,最后还是变成了抄代码... 代码参考了:POJ 1811 Prime Test(大素数判断和素因子分解) - kuangbin - 博客园 学习链接: Miller-Ra ...

  2. poj 2689 大范围素数

    题意:求大区间A  B内离的最近和最远的两个素数,A B<=2,147,483,647. 分析:先用大素数的线性筛法,预处理出1-sqrt(2,147,483,647)的所有素数,然后用 b[0 ...

  3. 筛指定区间的素数[区间偏移二次筛法]

    引入问题: 给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对. 同时,你还需要找到距离最远的 ...

  4. poj 2262 Goldbach's Conjecture(筛素数)

    2018-5-23 验证哥德巴赫猜想,直接将素数全部筛出来,然后从小到大枚举即可,找到的第一个满足条件的肯定就是差值最大的即满足题意的. 普通筛素数: #include<iostream> ...

  5. 素数统计 平移区间筛质数(1e9)

    素数统计 思路: 平移区间筛质数(1e9), 对于每个质数逐个在区间中筛数 #include <cstdio> #include <cstring> #include < ...

  6. 2404 Super Prime(欧拉筛素数)

    2404 Super Prime(欧拉筛素数) Problem Description We all know, prime is a kind of special number which has ...

  7. 解题报告:poj2689 Prime Distance

    2017-10-03 11:29:20 writer:pprp 来源:kuangbin模板 从已经筛选好的素数中筛选出规定区间的素数 /* *prime DIstance *给出一个区间[L,U],找 ...

  8. Prime Distance On Tree-树分治+FFT

    题目描述 Problem description. You are given a tree. If we select 2 distinct nodes uniformly at random, w ...

  9. 2019 ACM/ICPC 南京站 E.Observation,区间筛

    题目大意 求 (∑d=LR(fdxor K))(modP)\Big(\sum\limits_{d=L}^{R} (f_d\text{ xor } K)\Big)\pmod{P}(d=L∑R​(fd​  ...

最新文章

  1. 真香!如何用300行代码写完一个Spring基本框架?
  2. wordpress android,WordPress for Android 2.0 试用记
  3. java8 - 新的时间日期API示例
  4. 【面试】JAVA六种运算符详解及优先级
  5. 实现才是目的——《大道至简》第六章读后感
  6. 最优化作业第6章——无约束多维非线性规划方法
  7. php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
  8. keepalived安装实录
  9. Antd 多层Modal+Form组件嵌套 如何在父级组件中清空子级组件状态与数据?
  10. 「CJOJ2723」Reserve
  11. Python中的两种路径
  12. 蓝桥杯 ALGO-115 算法训练 和为T Java版
  13. 给hadoop 2.7.1 定制树莓派参数
  14. struts启动过滤器异常_Spring 统一异常处理的方式
  15. 视频教程-6小时JavaScript基础精讲-JavaScript
  16. ENGLISH-剑桥-朗文-柯林斯-韦氏dictionary
  17. 使用ps工具进行图片分析
  18. 北航计算机研究院,计算机学院-北航研究生院-北京航空航天大学
  19. java爬取国家应急平台漏洞公告数据
  20. kata-containers对接firecracker

热门文章

  1. Nginx的rewrite案例之防盗链
  2. Redis面试题详解
  3. 解决cookie写入问题
  4. React相关资源推荐
  5. Linux环境下安装Redis
  6. Python简介-01-Python的起源
  7. spring项目概念-IOCDI
  8. log4j2.xml
  9. JDBC详解系列之流程
  10. jQuery版本的网页开关灯、jQuery版本网页开关灯的另一种写法