http://poj.org/problem?id=2689
题意:给出一个L和R,L和R最大差值为100W,问区间[L,R]内相邻的素数最大差值和最小差值分别为多少。(1<=L<R<=2,147,483,647)
题解:用筛选法,首先第一次筛选出从1到sqrt(2,147,483,647)之间的素数;第二次筛选时,利用第一次筛选出来的素数,判断L到U区间范围内的数是否是素数;
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const double eps=1e-8;
const double INF=1e50;
//const double pi=acos(-1);
#define N 1000005
#define M 46500
bool c[N];
int q[N];
int main()
{
freopen("a","r",stdin);
int a,b,n=1;
long long i,j;
q[1]=2;
for (i=3;i<=M;i++)
{
bool f=true;
for (j=1;j<=n;j++)
if (i%q[j]==0)
{
f=false;
break;
}
if (f==true)
{
n++;
q[n]=i;
}
}
while (scanf("%d%d",&a,&b)!=EOF)
{
memset(c,true,sizeof(c));
for (i=1;i<=n && b>=q[i];i++)
{
int ss;
if (a%q[i]==0) ss=a/q[i];
else ss=a/q[i]+1;
if (ss==1) ss=2;
for (j=ss;j<=b/q[i];j++) c[j*q[i]-a]=false;
}
if (a==1) c[0]=false;
int s1,t1,s2,t2,p;
s1=t1=t2=p=s2=0;
for (i=a;i<=b;i++)
if (c[i-a]==true)
{
if (p==0)
{
s1=i;
t1=i;
}
else
{
if (s2==0) s2=i;
else if ((i-p)<(s2-s1))
{
s1=p;
s2=i;
}
if (t2==0) t2=i;
else if ((i-p)>(t2-t1))
{
t1=p;
t2=i;
}
}
p=i;
}
if (s2==0) printf("There are no adjacent primes.\n");
else printf("%d,%d are closest, %d,%d are most distant.\n",s1,s2,t1,t2);
}
return 0;
}