POJ - 2689 Prime Distance(素数区间筛模板)
题目链接:点击查看
题目大意:给出一段闭区间[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(素数区间筛模板)相关推荐
- Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho
随机化算法,想尝试自己写一下,最后还是变成了抄代码... 代码参考了:POJ 1811 Prime Test(大素数判断和素因子分解) - kuangbin - 博客园 学习链接: Miller-Ra ...
- poj 2689 大范围素数
题意:求大区间A B内离的最近和最远的两个素数,A B<=2,147,483,647. 分析:先用大素数的线性筛法,预处理出1-sqrt(2,147,483,647)的所有素数,然后用 b[0 ...
- 筛指定区间的素数[区间偏移二次筛法]
引入问题: 给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对. 同时,你还需要找到距离最远的 ...
- poj 2262 Goldbach's Conjecture(筛素数)
2018-5-23 验证哥德巴赫猜想,直接将素数全部筛出来,然后从小到大枚举即可,找到的第一个满足条件的肯定就是差值最大的即满足题意的. 普通筛素数: #include<iostream> ...
- 素数统计 平移区间筛质数(1e9)
素数统计 思路: 平移区间筛质数(1e9), 对于每个质数逐个在区间中筛数 #include <cstdio> #include <cstring> #include < ...
- 2404 Super Prime(欧拉筛素数)
2404 Super Prime(欧拉筛素数) Problem Description We all know, prime is a kind of special number which has ...
- 解题报告:poj2689 Prime Distance
2017-10-03 11:29:20 writer:pprp 来源:kuangbin模板 从已经筛选好的素数中筛选出规定区间的素数 /* *prime DIstance *给出一个区间[L,U],找 ...
- Prime Distance On Tree-树分治+FFT
题目描述 Problem description. You are given a tree. If we select 2 distinct nodes uniformly at random, w ...
- 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 ...
最新文章
- 真香!如何用300行代码写完一个Spring基本框架?
- wordpress android,WordPress for Android 2.0 试用记
- java8 - 新的时间日期API示例
- 【面试】JAVA六种运算符详解及优先级
- 实现才是目的——《大道至简》第六章读后感
- 最优化作业第6章——无约束多维非线性规划方法
- php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
- keepalived安装实录
- Antd 多层Modal+Form组件嵌套 如何在父级组件中清空子级组件状态与数据?
- 「CJOJ2723」Reserve
- Python中的两种路径
- 蓝桥杯 ALGO-115 算法训练 和为T Java版
- 给hadoop 2.7.1 定制树莓派参数
- struts启动过滤器异常_Spring 统一异常处理的方式
- 视频教程-6小时JavaScript基础精讲-JavaScript
- ENGLISH-剑桥-朗文-柯林斯-韦氏dictionary
- 使用ps工具进行图片分析
- 北航计算机研究院,计算机学院-北航研究生院-北京航空航天大学
- java爬取国家应急平台漏洞公告数据
- kata-containers对接firecracker