prime distance

L~R中质数距离最小最大值(R-L<=1e6)

思路过程:

  1. 注意到区间长度很小 我们考虑采用枚举区间长度的办法 \(O(L\sqrt R)\)
  2. 转化思路 用\(\sqrt{n}\)内 所有的倍数筛掉区间内的数 复杂度不便
  3. 注意到这样会有重复 那么我们用\(\sqrt{n}\)内所有质数筛一遍就可以

线性筛包含的是一种思想: 用最小质因子来筛掉数 本题相当于是埃氏筛和试除法的结合

if(l==1) ans[1]=1;
int t=sqrt(r);
for(int i=2;i<=t;i++)
{
	if(vis[i]) continue;
	s[++tot]=i;
	for(int j=i;j<=t/i;j++) vis[i*j]=1;
}
for(int i=1;i<=tot;i++)
{
	int x=s[i];
	for(int j=max((l/x),2);j<=r/x;j++)
		ans[x*j-l+1]=1;
}	
int last1=0x3f3f3f3f,last2=0xcfcfcfcf;
ret1=-inf; ret2=inf; 
int flag=0;
for(int i=1;i<=r-l+1;i++)
{
	if(ans[i]) continue;flag++;
	if(i-last1>ret1){ret1=i-last1;a1=last1;a2=i;}last1=i;
	if(i-last2<ret2){ret2=i-last2;a3=last2;a4=i;}last2=i;
}
if(flag<2) puts("There are no adjacent primes.");
else printf("%d,%d are closest, %d,%d are most distant.\n",a3+l-1,a4+l-1,a1+l-1,a2+l-1);

注意:

  1. 埃氏筛法不要从自身开始标记 可以从x的平方开始标记 这也就涉及到大于下界的第一个数的问题,题目中的这种处理方式 枚举系数比枚举具体的数更加好写,同时 由于会访问到i*i 有可能会爆数组
  2. 质数问题特别注意1
  3. 区间长度与质数个数不是一回事 看看用来存储的空间要开多大
posted @ 2022-02-08 10:49  __iostream  阅读(45)  评论(0)    收藏  举报