POJ 2689 Prime Distance [素数筛+想法]
2017-08-24 20:30
381 查看
题意:给出[L,R]的区间,问这个区间内相邻素数的最大距离和最小距离
题解:小于2147483647的素数用到的小素数,只有sqrt(2147483,647)个,我们只要枚举这些素数,筛掉合数就可以得到这个区间的所有素数。
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000005
using namespace std;
bool f
;
int b
,top;
bool ff
;
int main()
{
memset(f,true,sizeof(f));
f[0]=f[1]=false;
for(int i=2;i<N;i++)
{
if(f[i])
{
b[top++]=i;
for(int j=2;i*j<N;j++)
f[j*i]=false;
}
}
int l,r;
while(~scanf("%d%d",&l,&r))
{
memset(ff,true,sizeof(ff));
for(int i=0;i<top;i++)
for(int j=l/b[i];j<=r/b[i];j++)
if(j*b[i]>=l&&j*b[i]<=r&&j!=1)ff[j*b[i]-l]=false;
int last=0;
while((l+last<N&&!f[l+last])||(!ff[last]&&last<=r-l))last++;
int ma=0,mi=10000000;
int ma1=-1,ma2=-1,mi1=-1,mi2=-1;
for(int i=last+1;i<=r-l;i++)
{
if(ff[i])
{
if(l+i<N)if(!f[l+i])continue;
int len=i-last;
if(ma<len)
{
ma1=last;
ma2=i;
ma=len;
}
if(mi>len)
{
mi1=last;
mi2=i;
mi=len;
}
last=i;
}
}
if(ma1==-1)printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",mi1+l,mi2+l,ma1+l,ma2+l);
}
}
题解:小于2147483647的素数用到的小素数,只有sqrt(2147483,647)个,我们只要枚举这些素数,筛掉合数就可以得到这个区间的所有素数。
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#define N 1000005
using namespace std;
bool f
;
int b
,top;
bool ff
;
int main()
{
memset(f,true,sizeof(f));
f[0]=f[1]=false;
for(int i=2;i<N;i++)
{
if(f[i])
{
b[top++]=i;
for(int j=2;i*j<N;j++)
f[j*i]=false;
}
}
int l,r;
while(~scanf("%d%d",&l,&r))
{
memset(ff,true,sizeof(ff));
for(int i=0;i<top;i++)
for(int j=l/b[i];j<=r/b[i];j++)
if(j*b[i]>=l&&j*b[i]<=r&&j!=1)ff[j*b[i]-l]=false;
int last=0;
while((l+last<N&&!f[l+last])||(!ff[last]&&last<=r-l))last++;
int ma=0,mi=10000000;
int ma1=-1,ma2=-1,mi1=-1,mi2=-1;
for(int i=last+1;i<=r-l;i++)
{
if(ff[i])
{
if(l+i<N)if(!f[l+i])continue;
int len=i-last;
if(ma<len)
{
ma1=last;
ma2=i;
ma=len;
}
if(mi>len)
{
mi1=last;
mi2=i;
mi=len;
}
last=i;
}
}
if(ma1==-1)printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",mi1+l,mi2+l,ma1+l,ma2+l);
}
}
相关文章推荐
- poj 2689 Prime Distance (double筛筛出大素数)
- POJ 2689 Prime Distance [筛法选取素数]【数论】
- POJ - 2689 - Prime Distance - (区间大数筛素数)
- poj 2689 Prime Distance 筛法+区间筛素数
- POJ-2689 Prime Distance(区间素数筛--经典题)
- POJ2689-Prime Distance-区间筛素数
- POJ-2689 Prime Distance (两重筛素数,区间平移)
- Prime Distance poj 2689 区间内的素数打表模板
- [ACM] POJ 2689 Prime Distance (筛选范围大素数)
- poj 2689 Prime Distance 筛素数加强版
- Poj 2689 Prime Distance ----大区间素数筛选
- poj 2689 Prime Distance(筛素数)
- poj 2689 Prime Distance(大区间筛素数)
- POJ 2689 Prime Distance (二次?筛素数)
- POJ 2689 Prime Distance(区间相邻素数最大、小距离,区间素数筛)
- 数论 - 素数的运用 --- poj 2689 : Prime Distance
- poj 2689 Prime Distance 二次筛素数
- 【POJ - 2689】 Prime Distance 【素数区间筛】
- POJ 2689 Prime Distance(素数筛选)
- poj 2689 Prime Distance 素数