筛法
POJ维护后第一天啦啦啦
要筛
231−1
范围内的数,只需要筛
231−1−−−−−−√(≈46341)
以内的素数即可。然后根据这些素数去筛L~U之间的数即可。
4e4+7比较小,一般的筛法就可以了。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1000000
#define MAXM 100010
#define MAX 80000
#define INF 1e12
using namespace std;
typedef long long LL;
LL l,r,p;
LL prime[MAXN+5],pr[MAXN+5];
bool f[MAXN+5];
void Make(){
memset(f,true,sizeof(f));
for (LL i=2;i<=MAXM;i++){
if (f[i]) prime[++p]=i;
for (LL j=1;j<=p&&prime[j]*i<=MAXM;j++){
f[prime[j]*i]=false;
if (i%prime[j]==0) break;
}
}
}
int main(){
Make();
while (scanf("%lld%lld",&l,&r)==2){
memset(f,true,sizeof(f));
if (l<2) l=2;
for (LL i=1;i<=p;i++){
LL k=l/prime[i];
if (l%prime[i]) k++;
if (k==1) k++;
for (LL j=prime[i]*k;j<=r;j+=prime[i])
if (j>=l)
f[j-l+1]=false;
}
LL al=0,ar=0,il=0,ir=1e10,t=0;
for (LL i=1;i<=r-l+1;i++)
if (f[i])
pr[++t]=i+l-1;
if (t<=1){
printf("There are no adjacent primes.\n");
continue;
}
for (LL i=1;i<t;i++){
if (pr[i+1]-pr[i]<ir-il){
il=pr[i]; ir=pr[i+1];
}
if (pr[i+1]-pr[i]>ar-al){
al=pr[i]; ar=pr[i+1];
}
}
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",il,ir,al,ar);
}
return 0;
}