博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法学习之路|POJ2689(素数筛)
阅读量:6157 次
发布时间:2019-06-21

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

题目大意:选出区间L,R之间相邻素数中差值最大和最小的素数对

素数筛(线性筛):

#include
#include
#include
using namespace std; #define MAX 10000000long long su[MAX],cnt; bool isprime[MAX]; void prime() { cnt=1; memset(isprime,1,sizeof(isprime));//初始化 isprime[0]=isprime[1]=0;//0和1不是素数 for(long long i=2;i<=MAX;i++) { if(isprime[i]) su[cnt++]=i;//保存素数 for(long long j=1;j

思路:直接用素数筛会超时(int范围线性复杂度时间复杂度已经达到10e9),而区间间隔比较小,只有1e6,而且对于int范围内的合数来说,最小质因子必定小于2^16。所以可以进行二次筛素数,第一次对50000以内筛素数,第二次筛出L,R区间内素数即可。

代码:

#include 
#include
#include
#include
using namespace std;#define INF 1e9#define maxn 50005#define maxm 100005int l,u;int su[maxn],isprime[maxn],f[maxm];int cnt=0;void prime(){ memset(isprime,1,sizeof(isprime)); isprime[0]=isprime[1]=0; for(int i=2;i<=maxn;i++) { if(isprime[i]) su[cnt++]=i; for(int j=1;j
>l>>u) { if(l==1)l=2;//注意l=1 memset(f,0,sizeof(f)); for(int i=0;i
1) f[j*su[i]-l]=1; } int p=-1,max_ans=-1,min_ans=INF,x1,y1,x2,y2; for(int i=0;i<=u-l;i++)//暴力枚举 { if(f[i]==0) { if(p==-1) { p=i; continue; } if(max_ans
i-p) { min_ans=i-p; x2=p+l;y2=i+l; } p=i; } } if(max_ans==-1)cout<<"There are no adjacent primes."<

转载地址:http://mqsfa.baihongyu.com/

你可能感兴趣的文章
菜鸟学SSH(八)——Hibernate对象的三种状态
查看>>
2014的到来
查看>>
与众不同 windows phone (29) - Communication(通信)之与 OData 服务通信
查看>>
[转载]最完整PHP.INI中文版
查看>>
基于阿里云server搭建SVNserver
查看>>
【HTML5&CSS3进阶学习02】Header的实现·CSS中的布局
查看>>
关于SpringMVC和Struts2的区别
查看>>
jQuery live事件说明及移除live事件方法
查看>>
PadLeft 和 PadRight
查看>>
ubuntu openstack
查看>>
多客服功能终于也向所有微信认证的订阅号开放了
查看>>
roundup配置
查看>>
bootstrat 设置 select option 选项的值
查看>>
str()和repre()的区别
查看>>
炫酷实用的jQuery插件 涵盖菜单、按钮、图片
查看>>
几种流行Webservice控制框架
查看>>
精美jQuery插件及源码 前端开发福利
查看>>
mysql数据优化--数据库结构的优化
查看>>
教育 z
查看>>
javadoc入门
查看>>