POJ2689:Prime Distance——题解
http://poj.org/problem?id=2689
题目大意,给不超过int的l,r,其中r-l+1<=1000000,筛出其中的素数,并且求出相邻素数差值最大和最小的一对。
——————————————————
显然这是一道筛出l和r之间素数的裸题。
我们发现对于区间里的一个合数,其最大质因子不会超过50000(不然50000平方就大于2147483647)
秉承着正难则反的思想,筛1-50000素数,然后用一种很神奇的方法判断掉区间里的合数,统计素数即可。
判断方法:
首先我们将每个素数(记为su)平方得到t,一定是合数。
如果发现其<l。
我们就可以t=l/su*su,得到的也一定是合数。
如果此时仍然<l,我们为t+=su,得到的还是合数。
当然如果超了r那就continue;
然后对于t打标记。
然后不断地t+=su直到超r为止。
可以发现一定能够筛全合数。
简略证明:
不断地加相当于乘。
所以实际上我们在做的就是(例如su=2),就是2*2,2*3,2*4,2*5……这些全是合数。
而且因为起点是平方,所以避免了3*2这样的重复产生,所以更加的快捷。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const int INF=;
int su[]={};
bool he[]={};
int cnt=;
bool vis[]={};
void Euler(int n){
for(int i=;i<=n;i++){
if(he[i]==){
cnt++;
su[cnt]=i;
}
for(int j=;j<=cnt&&i*su[j]<=n;j++){
he[su[j]*i]=;
if(i%su[j]==)break;
}
}
return;
}
int main(){
Euler();
int l,r;
while(scanf("%d%d",&l,&r)!=EOF){
memset(vis,,sizeof(vis));
int ans=;
for(int i=;i<=cnt&&su[i]<=sqrt(r);i++){
//t接下来无论怎么变都是合数
int t=su[i]*su[i];
if(t<l)t=l/su[i]*su[i];//t太小的时候就得这样让它变大点
if(t<l){
if(t<=r-su[i]){
t+=su[i];
}else continue;
}
while(t<=r){
vis[t-l]=;
if(t==su[i])vis[t-l]=;//压缩空间
if(t<=r-su[i])t+=su[i];
else break;
}
}
if(l==)vis[]=;
int p=-;
int x1,y1,x2,y2,ans1=-,ans2=INF;
for(int i=;i<=r-l;i++){
if(!vis[i]){
if(p==-){p=i;continue;}
if(ans1<i-p){ans1=i-p;x1=p+l;y1=i+l;}
if(ans2>i-p){ans2=i-p;x2=p+l;y2=i+l;}
p=i;
}
}
if(ans1==-)cout<<"There are no adjacent primes."<<endl;
else cout<<x2<<","<<y2<<" are closest, "<<x1<<","<<y1<<" are most distant."<<endl;
}
return ;
}
POJ2689:Prime Distance——题解的更多相关文章
- poj2689 Prime Distance题解报告
题目戳这里 [题目大意] 给定一个区间[L,R],求区间内的质数相邻两个距离最大和最小的. [思路分析] 其实很简单呀,很明显可以看出来是数论题,有关于质数的知识. 要注意一下的就是L和R的数据范围都 ...
- POJ2689 Prime Distance(数论:素数筛选模板)
题目链接:传送门 题目: Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Des ...
- POJ-2689 Prime Distance (两重筛素数,区间平移)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13961 Accepted: 3725 D ...
- 解题报告:poj2689 Prime Distance
2017-10-03 11:29:20 writer:pprp 来源:kuangbin模板 从已经筛选好的素数中筛选出规定区间的素数 /* *prime DIstance *给出一个区间[L,U],找 ...
- POJ-2689 Prime Distance,区间素数筛法
Prime Distance 只会埃氏筛法的弱鸡今天读了读挑战程序设计120页,明白了求小区间内素数的方 ...
- POJ2689 - Prime Distance(素数筛选)
题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...
- POJ2689:Prime Distance(大数区间素数筛)
The branch of mathematics called number theory is about properties of numbers. One of the areas that ...
- POJ2689 Prime Distance 质数筛选
题目大意 求区间[L, R]中距离最大和最小的两对相邻质数.R<2^31, R-L<1e6. 总体思路 本题数据很大.求sqrt(R)的所有质数,用这些质数乘以j, j+1, j+2... ...
- poj2689 Prime Distance(素数区间筛法)
题目链接:http://poj.org/problem?id=2689 题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L&l ...
随机推荐
- android学习十三 首选项
1,首选项可用用来持久保存用户设置,游戏最高分等 2,首选项有,列表首选项,复选框首选项,对话框首选项.. 3,通过xml文件和代码创建首选项 addPreferencesFromResou ...
- git 操作几个命令
git clone ssh://lijianfeng@192.168.1.246:29418/GMGameSDK压栈:git stash查状态:git status切换到要修改的提交:git reb ...
- 180602-nginx多域名配置
文章链接:https://liuyueyi.github.io/hexblog/2018/06/02/180602-nginx多域名配置/ nginx多域名配置 原来的域名过期了,重新买了一个hhui ...
- Appium(Python)测试混血App
Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app兼具Native App良好用户交互体验的优势和Web App跨平台开发的优势 HybridApp ...
- angular-列表进行添加、编辑等操作时此行变色。
今天接触了一个功能,就是在一个列表中,当你新增或者对第N列进行编辑,删除等操作时这一列会变颜色.让用户对操作了哪行数据更认识更清晰,刷新之后这行的颜色就会消失.我觉得这个很有意思,记录一下.效果如下. ...
- TW实习日记:第14天
今天可以说是又忙又不忙了,忙是因为要赶bug,似乎总有种隐形的力量催着你交工,但实际上太多涉及后端接口的问题,所以又要等别人修改接口才能改bug,可以说真是十分蛋疼了. 改bug的最大心得就是:写好注 ...
- lintcode 平面列表
问题描述: 给定一个列表,该列表中的每个要素要么是个列表,要么是整数.将其变成一个只包含整数的简单列表. 样例: 给定 [1,2,[1,2]],返回 [1,2,1,2]. 给定 [4,[3,[2,[1 ...
- Android开发-API指南-<permission-tree>
<permission-tree> 英文原文:http://developer.android.com/guide/topics/manifest/permission-tree-elem ...
- ionic 获取input的值
1.参数传递法 例子:获取input框内容 这里有个独特的地方,直接在input处使用 #定义参数的name值,注意在ts中参数的类型 在html页面中 <ion-input type=&quo ...
- LeetCode 138——复制带随机指针的链表
1. 题目 2. 解答 第一次遍历链表的时候,复制旧链表的节点值建立一个新的链表,同时定义一个 unordered_map 作为哈希表,哈希表的键为旧链表的节点指针,值为新链表的节点指针. 然后,第二 ...