POJ 2689 区间筛选质数
2017-01-17 23:47
225 查看
题目链接:http://poj.org/problem?id=2689
题意:
给定区间 [L,U] 中,求相邻两个质数的 最大(小)差值 所对应的质数
有多组 [L,U]。
规模(1<=L< U<=2,147,483,647,区间长度<1,000,000. )
类型:
经典的区间筛选质数
分析:
定理:所有的合数都可以拆分为n个质数的乘积
从L,U的大小(2的32次)明白:最大的质因子 < 2的16次。所以先打个质数表prime1。
根据质数表prime1,可以和方便地求出 [L,U]内的合数,进而打出第二张质数表prime2([L,U]内的质数)。
最后暴力扫一遍。
prime[0]存储质数的个数。
小心 L==1 时需要进行处理。
时间复杂度&&优化:
9064K 94ms
代码:
题意:
给定区间 [L,U] 中,求相邻两个质数的 最大(小)差值 所对应的质数
有多组 [L,U]。
规模(1<=L< U<=2,147,483,647,区间长度<1,000,000. )
类型:
经典的区间筛选质数
分析:
定理:所有的合数都可以拆分为n个质数的乘积
从L,U的大小(2的32次)明白:最大的质因子 < 2的16次。所以先打个质数表prime1。
根据质数表prime1,可以和方便地求出 [L,U]内的合数,进而打出第二张质数表prime2([L,U]内的质数)。
最后暴力扫一遍。
prime[0]存储质数的个数。
小心 L==1 时需要进行处理。
时间复杂度&&优化:
9064K 94ms
代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<algorithm> #include<iostream> using namespace std; const int MAXN = (1<<16)+10; const int inf = 1000000007; const int mod = 1000000007; int prime1[1<<17];///2^16内的质数表,prime1[0]是质数的个数 void getprime1(){///得到2^16内的质数表 memset(prime1,0,sizeof(prime1)); for(int i=2;i<=MAXN;i++){ if(prime1[i]==0)prime1[++prime1[0]]=i; for(int j=1;j<=prime1[0]&&prime1[j]<=MAXN/i;j++){ prime1[prime1[j]*i]=1; if(i%prime1[j]==0)break;///优化,2*k包括了4*k } } } int notprime2[1000000+10];///质数性表,notprime2[0]表示L+0的质数性,1表示非质数,0表示质数 int prime2[1000000+10]; void getprime2(int l,int r){ memset(notprime2,0,sizeof(notprime2));///得到:质数性表 for(int i=1 a77a ;i<=prime1[0];i++){ for(int j=(l-1)/prime1[i]+1;j<=r/prime1[i];j++){ if(j>=2)notprime2[prime1[i]*j-l]=1; } } memset(prime2,0,sizeof(prime2));///得到:质数表 for(int i=l-l;i<=r-l;i++){ if(notprime2[i]==0){ //cout<<i+l<<"@"; prime2[++prime2[0]]=i+l; } } } int main() { getprime1(); int l,r; while(cin>>l>>r){ if(l==1)l=2; getprime2(l,r); ///暴力 if(prime2[0]<2){cout<<"There are no adjacent primes."<<endl;continue;} int maxx,minn,maxr,minr; maxx=0;minn=inf; for(int i=2;i<=prime2[0];i++){ //cout<<prime2[0]<<" "; if(prime2[i]-prime2[i-1]>maxx){maxx=prime2[i]-prime2[i-1];maxr=prime2[i];} if(prime2[i]-prime2[i-1]<minn){minn=prime2[i]-prime2[i-1];minr=prime2[i];} } printf("%d,%d are closest, %d,%d are most distant.\n",minr-minn,minr,maxr-maxx,maxr); } return 0; }
相关文章推荐
- poj 2689(区间筛选素数。。。很经典)
- poj:2689--用筛选法选素数求区间[L,U]的所有素数
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
- POJ 2689 Prime Distance(大区间素数筛选)
- [ACM] POJ 2689 Prime Distance (大区间素数筛选)
- POJ题目2689 Prime Distance(任何区间素数筛选)
- POJ - 2689 Prime Distance(大区间素数筛选)
- 大区间素数筛选(POJ 2689)
- Poj 2689 Prime Distance ----大区间素数筛选
- poj 2689(区间素数筛选)
- 大区间素数筛选(POJ 2689)
- 大区间素数筛选(POJ 2689)
- POJ 2689 Prime Distance【大区间素数筛选】【埃氏筛法】【经典题】
- POJ 2689 (素数的二次筛选)
- POJ-2689 Prime Distance,区间素数筛法
- POJ 2689 Prime Distance (素数+两次筛选)
- poj 2689解题报告(区间筛素数,经典)
- poj 2689 Prime Distance 二次筛法,找出给定区间所有约数
- [ACM] POJ 2689 Prime Distance (筛选范围大素数)
- 【POJ - 2689】 Prime Distance 【素数区间筛】