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 integerx (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
2 4 2
3
6 13 1
4
1 4 3
-1
主要还是题意难以理解在区间 [a,b] 找出一个最小的区间长度 l
使得区间[a,b]长度为l的子区间,含有至少k个质数
先打一个质数表,进行累加,用二分查找 l对每一个l进行验证,直到找到最小的l
<span style="font-size:18px;">#include<cstdio>
#include<cstring>
#define maxn 1000000
int prime[maxn+11];
int num[maxn+11];
int a,b,k;
void prime_table()
{
int i,j;
memset(prime,0,sizeof(prime));
memset(num,0,sizeof(num));
prime[0]=prime[1]=1;
for(i=2;i<=maxn;++i)
{
if(!prime[i])
{
for(j=i+i;j<=maxn;j+=i)
prime[j]=1;
}
}
prime[0]=prime[1]=0;
for(i=2;i<=maxn;++i)
{
if(prime[i])
prime[i]=0;
else
prime[i]=1;
prime[i]+=prime[i-1];
}
}
int judge(int mid)
{
int i;
mid-=1;
for(i=a;i+mid<=b;++i)
{
if(prime[i+mid]-prime[i-1]<k)
return 0;
}
return 1;
}
int main()
{
prime_table();
scanf("%d%d%d",&a,&b,&k);
int l=1,r=b-a+1,mid,ans;
if(prime[b]-prime[a-1]>=k)
{
while(l<=r)
{
mid=(l+r)>>1;
if(judge(mid))
{
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%d\n",ans);
}
else
printf("-1\n");
return 0;
}</span><span style="font-size:14px;"> </span>