【题目】
【题意】
给出整数a,b ,k,a,b代表[a,b]区间,求出最小的长度l,使得[a,b]区间内任何一个长度为l的连续区间中素数的数量>=k.
【思路】
用线性筛法筛出[1,1e6]中的素数,用一个数组cou[i]记录1到i的素数数目,便于进行某个区间素数数目的计算。由于答案具有单调性,考虑用二分判断并输出最小长度l。
【代码】
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stack>
#include <queue>
#include <algorithm>
#include <iostream>
#define mem(a) memset(a,0,sizeof(a))
#define go(i,a,b) for(int i=a;i<=b;i++)
#define og(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=1e6;
const int inf=0x3f3f3f3f;
typedef long long ll;
typedef unsigned long long ull;
bool num[N+5];
int prime[N+5],cou[N+5];
int a,b,k;
void isprime()
{
memset(num,true,sizeof(num));
num[1]=false; int c=0;
for(int i=2;i<=N;i++)
{
if(num[i]) prime[c++]=i;
for(int j=0;j<c&&i*prime[j]<=N;j++)
{
num[prime[j]*i]=false;
if(i%prime[j]==0) break;
}
}
}
void init()
{
isprime(); mem(cou);
for(int i=2;i<=N;i++)
if(num[i]) cou[i]=cou[i-1]+1;
else cou[i]=cou[i-1];
}
int cul(int l)
{
for(int i=a;i<=b-l+1;i++)
if(cou[i+l-1]-cou[i-1]<k) return 0;
return 1;
}
main()
{
init();
while(~scanf("%d%d%d",&a,&b,&k))
{
int l=1,r=b-a+1,mid,f=0;
while(l<=r)
{
mid=(l+r)/2;
if(cul(mid)) r=mid-1,f=1;
else l=mid+1;
}
if(f) printf("%d\n",l);
else printf("-1\n");
}
}