题目链接
题意:
给定L,R (( 2e9 求该区间内相邻最近的一对质数和相邻最远的一对质数
多组输入。
分析:
emmm其实很简单的,保证了L R相间1e6,对于2e9筛出1e5的质因子。只需要打标记打到L,R区间就OK了。然后枚举更新答案
#include<set>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define bep(i,a,b) for(int i=a;i>=b;--i)
#define lowbit(x) (x&(-x))
using namespace std;
const int N = 1e5+10,inf = 0x3f3f3f3f;
int n,arr[N],l,r;
bool st[N];
int prime[N],tot;
void getprime(){
rep(i,2,N){
if(!st[i]){
prime[++tot] = i;
if(i>10000)continue;
for(int j=i*i;j<=N;j+=i){
st[j] = true;
}
}
}
}
bool G[N*10+10];
void solve(){
getprime();
while(~scanf("%lld%lld",&l,&r)){
memset(G,0,sizeof G);
rep(i,1,tot){
if(prime[i]>r)break;
//printf("%lld\n",i);
int f = l/prime[i];
for(int j=f*prime[i];j<=r;j+=prime[i]){
//printf("%lld %lld\n",prime[i],j);
if(j == prime[i])continue;
if(j-l<0)continue;
G[j-l] = true;
}
}
if(l == 1)G[0] = true;
int now[N],k=0, ansl = -1,ansr = -1,x = -1,y = -1,dis1 = -1,dis2 = inf;
rep(i,0,r-l){
if(G[i]==false){
now[++k] = i;
}
}
rep(i,2,k){
if(now[i]-now[i-1]>dis1)ansl = now[i-1]+l,ansr = now[i]+l,dis1 = now[i]-now[i-1];
if(now[i]-now[i-1]<dis2)x = now[i-1]+l,y = now[i]+l,dis2 = now[i]-now[i-1];
}
if(dis1 == -1)puts("There are no adjacent primes.");
else printf("%lld,%lld are closest, %lld,%lld are most distant.\n",x,y,ansl,ansr);
}
}
signed main(){
solve();
}