题目意思是,对于在区间[a,b-l+1]中的每个数x,都有连续的l个数:x,x+1,x+2,x+l-1使得这其中至少存在k个素数,求最小的l 。
首先打个表,然后判断在区间[a,b]中是否存在k个素数,如果不存在,输出-1。
然后再从i = a->b 开始计算区间大小l使得[i,i+l-1]中至少有k个素数。
如果i+1对于l不能满足如上关系,那么更新l的值。
#include <iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 10000000
using namespace std;
int a,b,k,c,l;
int vis[1000010],prim[10000000];
void biao()
{
int m = sqrt(b+0.5);
c = 0;
memset(vis,0,sizeof vis);
for(int i = 2;i <= m;i++)if(!vis[i])
for(int j = i*i;j <= b;j+=i)vis[j] = 1;
for(int i = 2;i<=b;i++) if(!vis[i]) {prim[c++] = i;}
}
int main()
{
scanf("%d %d %d",&a,&b,&k);
biao();
l = -1;
int pos = lower_bound(prim,prim+c,a)-prim;
if(pos+k-1 >= c) l = -1;
else{
for(int i = a;i <= b;i++)
{
int pos = lower_bound(prim,prim+c,i)-prim;
if(pos+k-1 >= c) {l = b - i +2;if(l> b-a+1) l = -1; break;}
else
{
int y = prim[pos+k-1];
if(y - i +1> l) l = y - i+1;
}
if(i == b - l + 1)break;
}
}
printf("%d\n",l);
return 0;
}