博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2689 Prime Distance (素数筛选法,大区间筛选)
阅读量:4455 次
发布时间:2019-06-07

本文共 1630 字,大约阅读时间需要 5 分钟。

题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数。

用素数筛选法。

所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数。
由于sqrt(U)最大也只有2^16,所以我们可以用素数筛选法,先预处理出2~2^16之间的素数,然后再用这些素数筛选出L~U之间的素数。
接着就好办了。

有几个要注意的是:

1:L为1的情况,可以通过令L=2或者标记isp[0]=false。
2:建议用long long,否则很容易在过程中超int范围,导致数组越界RE。。。

 

#include 
#include
#include
using namespace std;const int maxn=(1<<16)+5;const int range=1000000+5;bool isprime[maxn]; //标记2~2^16之间的素数bool isp[range]; //标记L~U之间的素数,下标从0开始,对应L。int prime[maxn]; //存储2~2^16之间的素数int idx;long long L,U;void init(){ idx=0; memset(isprime,true,sizeof(isprime)); for(int i=2;i
1){ isp[j*p-L]=false; } } } int mina,minb,mindis=2000000,maxa,maxb,maxdis=0; int a,b; bool first=true; for(int i=0;i<=U-L;i++){ if(isp[i]){ if(!first){ b=i; if(b-a
maxdis){ maxa=a; maxb=b; maxdis=b-a; } a=b; } else{ first=false; a=i; } } } if(!maxdis){ printf("There are no adjacent primes.\n"); } else{ //注意:这里输出时long long格式,因为L是long long型 printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",mina+L,minb+L,maxa+L,maxb+L); } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/chenxiwenruo/p/3551240.html

你可能感兴趣的文章
[myeclipse]@override报错问题
查看>>
자주 쓰이는 정규표현식
查看>>
超简单的listview单选模式SingleMode(自定义listview item)
查看>>
vue-11-路由嵌套-参数传递-路由高亮
查看>>
HDU 1199 - Color the Ball 离散化
查看>>
[SCOI2005]骑士精神
查看>>
Hibernate原理解析-Hibernate中实体的状态
查看>>
六时车主 App 隐私政策
查看>>
C语言常见问题 如何用Visual Studio编写C语言程序测试
查看>>
Web用户的身份验证及WebApi权限验证流程的设计和实现
查看>>
hdu 2098 分拆素数和
查看>>
[ONTAK2010]Peaks kruskal重构树,主席树
查看>>
ECMAScript6-let与const命令详解
查看>>
iOS 使用系统相机、相册显示中文
查看>>
什么是敏捷设计
查看>>
SCSS的基本操作
查看>>
"安装程序无法定位现有系统分区" 问题解决
查看>>
.NET中栈和堆的比较
查看>>
【莫队】bzoj 3781,bzoj 2038,bzoj 3289
查看>>
如何优化limit
查看>>