Prime Distance Page138 区间质数
由于L,R太大,一开始想到用map表示该值是否为质数,后来一直T,把质数筛选过程优化到 还是过不了,怀疑应该是map的原因
修改后用 ,即可用数组存,一个细节就是如果L是1的话,它不会被 个质数(因为最小的质数为2)给筛为合数,故默认1为质数,但其实1不是质数,所以此时需要特判
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<queue>
#include<map>
#define ll long long
#define pb push_back
#define rep(x,a,b) for (int x=a;x<=b;x++)
#define repp(x,a,b) for (int x=a;x<b;x++)
#define W(x) printf("%d\n",x)
#define WW(x) printf("%lld\n",x)
#define pi 3.14159265358979323846
#define mem(a,x) memset(a,x,sizeof a)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int maxn=2e6+7;
const int INF=1e9;
const ll INFF=1e18;
bool prime[maxn],isprime[maxn];
ll primenum[maxn];
ll m=0,L,R;
vector<int> V;
void prime_init()
{
mem(prime,true);
prime[0]=prime[1]=false;
repp(i,2,maxn)
{
if (prime[i])primenum[m++]=i;
for (int j=0;j<m&&primenum[j]*i<maxn;j++)
{
prime[i*primenum[j]]=false;
if (i%primenum[j]==0)break;
}
}
}
int main()
{
prime_init();
while(~scanf("%lld%lld",&L,&R))
{
V.clear();
mem(isprime,true);
if (L==1)isprime[0]=false;
for (int i=0;i<m&&primenum[i]<=sqrt(R);i++)
{
for (int j=L/primenum[i];j<=R/primenum[i];j++)
{
if (j>1)isprime[primenum[i]*j-L]=false;
}
}
rep(i,L,R)if (isprime[i-L])V.pb(i);
if (V.size()<2)printf("There are no adjacent primes.\n");
else
{
int x1,y1,x2,y2,minn=INF,maxx=0;
repp(i,0,V.size()-1)
{
if (V[i+1]-V[i]<minn)
{
x1=V[i];
y1=V[i+1];
minn=y1-x1;
}
if (V[i+1]-V[i]>maxx)
{
x2=V[i];
y2=V[i+1];
maxx=y2-x2;
}
}
printf("%d,%d are closest, %d,%d are most distant.\n",x1,y1,x2,y2);
}
}
return 0;
}