POJ 2689 (素数的二次筛选)
来源:互联网 发布:王者传奇羽毛升级数据 编辑:程序博客网 时间:2024/05/20 07:50
poj 2689 Prime Distance (素数筛选的经典应用)
题意:给出一个区间,长度<=1000 000;求其中素数相邻素数之间的差最小的和最大的;
算法:素数筛选
其中区间的数可能较大,因此如果用试除法的话,显然不行的;
用筛选法,首先第一次筛选出从1到47000之间的素数;第二次筛选时,利用第一次筛
选出来的素数,判断L到U区间范围内的数是否是素数;
因为范围是1<=L< U<=2,147,483,647,而U-L<=1000 000;所以我们可以设置一个1000000
以内的数组,用res[i-L]的值为0或者1来表示是否是素数;
核心算法是第二次的筛选,其中j=begin*prime[i]表示的是在A,B区间中prime[i]的第一个倍数;依次筛选;
/************** POJ 2689*************/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int SIZE = 50000;long long L, U;int yes[SIZE];long long prim[SIZE];int k=0;int adp[1001000];void getPrim(){ memset(yes,0,sizeof(yes)); for(long long i=2;i<SIZE;i++) if(!yes[i]) { prim[k++]=i; for(long long j=i*i;j<SIZE;j+=i) yes[j]=1; }}int main(){ long long pre; long long maxV, u1, v1; long long minV, u2, v2; int flag; getPrim(); while(cin>>L>>U) { if(L<=1) L=2; //二次筛选过程 memset(adp,0,sizeof(adp)); for(int i=0;i<k&&prim[i]*prim[i]<=U;i++) { long long beg=L/prim[i]+(L%prim[i]>0); if(beg==1) beg++; for(long long j=beg*prim[i];j<=U;j+=prim[i]) //调整j,使得 L<=j<=U adp[j-L]=1; } maxV=-2*SIZE; minV=2*SIZE; flag=0; for(long long i=L;i<=U;i++) { if(!adp[i-L]) { flag++; if(flag>1) { int temp=i-pre; if(temp>maxV) {maxV=temp; u1=pre; v1=i;} if(temp<minV) {minV=temp; u2=pre; v2=i;} } pre=i; } } if(flag>1) cout<<u2<<","<<v2<<" are closest, "<<u1<<","<<v1<<" are most distant.\n"; else cout<<"There are no adjacent primes.\n"; } return 0;}/*1 22146483648 21474836472147483047 2147483647There are no adjacent primes.2146483811,2146483813 are closest, 2146841093,2146841273 are most distant.2147483053,2147483059 are closest, 2147483179,2147483237 are most distant.*/
- POJ 2689 (素数的二次筛选)
- poj 2689 (素数二次筛选)
- poj-2689素数筛选
- poj2689 素数二次筛选
- poj 2689 素数筛选的巧妙使用
- poj 2689(区间素数筛选)
- POJ 2689 Prime Distance 二次筛选
- [数论] POJ 2689 Prime Distance 二次筛选
- poj 2689 Prime Distance (大素数的筛选)
- poj 2689 Prime Distance 二次筛素数
- POJ 1595 素数的筛选输出问题
- poj 2689 线性时间筛选素数
- POJ 2689 Prime Distance(筛选两次素数)
- Prime Distance - POJ 2689 素数筛选
- 大区间素数筛选(POJ 2689)
- 大区间素数筛选(POJ 2689)
- POJ 2689 Prime Distance 素数筛选 -
- POJ 2739 素数筛选
- hdu 4571
- poj1286
- vim配置
- VS或C#或.NET环境下的发送邮件实现方法
- 【图片无损压缩利器】Image Optimizer
- POJ 2689 (素数的二次筛选)
- 网络基础知识总结
- HDU 2136
- C++拷贝构造函数详解
- java程序设计
- 2013杭电warm_up1 1010 Difference Between Primes
- 你究竟多想成功?(nba励志视频)
- C++拷贝构造函数(深拷贝、浅拷贝)
- uva 10361 Automatic Poetry