这是一道较为著名的数论题
原题来自:Waterloo local,题面详见 POJ 2689
给定两个整数 L,R ,求闭区间 [L,R] 中相邻两个质数差值最小的数对与差值最大的数对。当存在多个时,输出靠前的素数对。
多组数据。每行两个数 L,R。
详见输出样例。
2 17
14 17
2,3 are closest, 7,11 are most distant.
There are no adjacent primes.
对于全部数据,1≤L
上课讲过了,回家想了想敲了个49行代码,结果……不说了,看完代码再说吧
#include
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
#define x first
#define y second
typedef pair<int,int> pii;
void eth(int l,int r);
int ss[9]={0,2,3,5,7,11,13,17,37},ans,l,r,maxi,mini;
pii maxo,mino;
int main(){
while(cin>>l>>r){
eth(l,r);
if(mini==0x3f3f3f3f)
puts("There are no adjacent primes.");
else
printf("%d,%d are closest, %d,%d are most distant.\n",mino.x,mino.y,maxo.x,maxo.y);
}
}
void eth(int l,int r){
int sum=0,fi;
bool ks=0;
mini=0x3f3f3f3f;
for(int i=max(l,2);i<=r;i++){
bool k=1;
for(int j=1;j<=8;j++)
if(ss[j]!=i&&i%ss[j]==0){
k=0;
sum++;
break;
}
if(k&&ks){
if(sumpii(fi,i);
}
if(sum>maxi){
maxi=sum;
maxo=pii(fi,i);
}
sum=0;
fi=i;
}
else if(k)
ks=1,fi=i;
}
}
猜到了吧,TLE了
就一个测试点,还加了O2,有人能帮帮我吗?
知道了,将pair改为两个数字就行了,std考试时果然不该用啊