这题敲得我好感人啊,踌躇了几天,终于干掉它了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
ll l,u;
ll a[50010];
ll b[50010];
ll c[1000100];
ll d[1000100];
ll k = 0;
void init()
{
ll i,j;
memset(a,0,sizeof(a));
for(i=2;i<=50000;i++)
{
if(a[i]==0)
{
b[k++]=i;
for(j = i*i;j<=50000;j+=i)
{
a[j] = 1;
}
}
}
return ;
}
int main()
{
std::ios::sync_with_stdio(false);
ll i,j;
init();
//freopen("a.txt","w",stdout);
while(cin>>l>>u)
{
memset(c,0,sizeof(c));
for(i=0;i<k&&b[i]*b[i]<=u;i++)
{
j = l/b[i];
if(j==1)
j++;
if(j==0)
j+=2;
if(l%b[i])
j++; //没有加这句话,于是一天的噩梦开始了,卧槽。
for(;j*b[i]<=u;j++) // 交上去RE之后,全部改成了long long 类型
{ // 可是WA,于是看了一下b数组,卧槽,b[4776]的值在i==4000多的时候
c[j*b[i]-l]=1; //莫名其妙的变成了1,肺都气炸了,都没找到答案。后来改了c[i]=2;
} //发现b[4776]也变成了2,卧槽,我改变c数组的值,把b数组的值也改变了
} //后来才知道他下标变成了负值,访问到b数组去了,居然不报错,跟python
if(l==1) //似的,可以负值访问啊,哎,而且,两个数组的内存区域居然是连续的
c[0]=1; //数组访问在该内存区域没有被声明才报错,终于明白这种隐晦的错误了
ll s = 0;
for(j=0;j<=u-l;j++)
{
if(c[j]==0)
{
d[s++]=j;
}
}
ll maxx,minn;
maxx=0;
minn=0x7ffffffffLL;
ll pos1,pos2,pos3,pos4;
for(j=1;j<s;j++)
{
if(d[j]-d[j-1]>maxx)
{
maxx = d[j]-d[j-1];
pos1 = d[j-1];
pos2 = d[j];
}
if(d[j]-d[j-1]<minn)
{
minn = d[j]-d[j-1];
pos3 = d[j-1];
pos4 = d[j];
}
}
if(maxx == 0)
{
cout<<"There are no adjacent primes."<<endl;
}
else
{
cout<<pos3+l<<','<<pos4+l<<" are closest, "<<pos1+l<<","<<pos2+l<<" are most distant."<<endl;
}
}
return 0;
}