escription
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
Everay line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 10^6; a ≤ b).
Output
In a single line print a single integer — the required minimum l. If there's no solution, print -1.
Sample Input
2 4 2
6 13 1
1 4 3
Sample Output
3
4
-1
解析
题意就是给你一个[a,b]区间,你要找到最小的l(1<=l<=b-a+1)能使得任意的数x(a<=x<=b-l+1)在区间[x,x+l-1]存在至少k个素数
代码
#include<bits/stdc++.h>
#define MAX 1000005
using namespace std;
int prime[MAX],sum[MAX],a,b,k;
void is_prime() //素数筛选
{
for(int i=2;i<=MAX;i++)
{
for(int j=i*2;j<=MAX;j+=i)
{
prime[j]=1;
}
}
}
//区间素数个数
void Sum()
{
for(int i=2;i<=MAX;i++)
{
sum[i]=sum[i-1];
if(!prime[i])
{
sum[i]++;
}
}
}
int check(int L)
{
for(int i=a;i<=b-L+1;i++)
{
if(sum[i+L-1]-sum[i-1]<k)
return 0;
}
return 1;
}
int main()
{
is_prime();
Sum();
while(~scanf("%d%d%d",&a,&b,&k))
{
if(sum[b]-sum[a-1]<k)
{
printf("-1\n");
continue;
}
int left=1,right=b-a+1,mid,ans;
while(left<=right)
{
mid=(left+right)/2;
if(check(mid))
{
right=mid-1;
ans=mid;
}
else
left=mid+1;
}
printf("%d\n",ans);
}
return 0;
}