Description
You’ve decided to carry out a survey in the theory of prime numbers. Let us remind you that a prime number is a positive integer that has exactly two distinct positive integer divisors.
Consider positive integers a, a + 1, …, b (a ≤ b). You want to find the minimum integer l (1 ≤ l ≤ b - a + 1) such that for any integer x (a ≤ x ≤ b - l + 1) among l integers x, x + 1, …, x + l - 1 there are at least k prime numbers.
Find and print the required minimum l. If no value l meets the described limitations, print -1.
Input
A single line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 106; a ≤ b).
Output
In a single line print a single integer — the required minimum l. If there’s no solution, print -1.
Sample Input
Input
2 4 2
Output
3
Input
6 13 1
Output
4
Input
1 4 3
Output
-1
题意:输入a,b,k,问你在[a,b]里是否存在l使得a<=l<=b里有任意x,满足[x,x+l]里至少有k个素数
#include<stdio.h>
#include<math.h>
#include<string.h>
#define maxx 1000010
int r,prime[maxx],vis[maxx],cnt[maxx];
void wprime()
{
int m=(int)sqrt(1000000+1);
r=0;
memset(vis,0,sizeof(vis));
vis[0]=1;
vis[1]=1;
for(int i=2;i<=m;++i)
{
if(!vis[i])
{
prime[r++]=i;
for(int j=i*i;j<=1000005;j+=i)
vis[j]=1;
}
}
}
void dabiao()//打二分表,cnt数组储存的是从0开始到这里有多少个素数
{
wprime();
cnt[0]=0;
for(int i=1;i<=1000000;++i)
{
if(!vis[i]) cnt[i]=cnt[i-1]+1;
else
cnt[i]=cnt[i-1];
}
}
int check(int a,int b,int k,int l)//检查是否满足题意
{
int r=b-l+1;
for(int i=a;i<=r;++i)
{
if(cnt[i+l-1]-cnt[i-1]>=k)
continue;
else
return 0;
}
return 1;
}
int erfen(int a,int b,int k)
{
int L=1,R=b-a+1,mid;
while(L<=R)
{
mid=(L+R)/2;
if(check(a,b,k,mid))
R=mid-1;
else
L=mid+1;
}
return L;
}
int main()
{
int a,b,k;
dabiao();
while(scanf("%d%d%d",&a,&b,&k)!=EOF)
{
if(!check(a,b,k,b-a+1)) printf("-1\n");//如果最大的范围里都没有k个素数,说明不存在l值,输出-1
else
{
printf("%d\n",erfen(a,b,k));
}
}
return 0;
}