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.
A single line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 106; a ≤ b).
In a single line print a single integer — the required minimum l. If there's no solution, print -1.
2 4 2
3
6 13 1
4
1 4 3
-1
题目大意:给你数字a、b、k,让你求一个*最小*的数字L,使得在a、b区间内的任一长度为L的子连续区间内至少有k个素数。
解题思路:素数个数打表,+个二分。
代码如下:
#include <cstdio>
int flag[1000010];
int sum[1000010];
int a,b,k,mid;
void dabiao()//打素数表,sum[i]表示i前面的素数个数(包括i)
{
flag[0]=flag[1]=1;
for(int i=2;i<1000010;i++)
{
if(flag[i]==1)
continue;
for(int j=i*2;j<1000010;j=j+i)
{
flag[j]=1;
}
}
sum[0]=0;
for(int i=1;i<1000010;i++)
{
if(flag[i]==0)
{
sum[i]=sum[i-1]+1;
}
else
{
sum[i]=sum[i-1];
}
}
}
bool judge(int o)
{
int size=b-o+1;//题目中说的区间
for(int i=a;i<=size;i++)
{
if(sum[i+o-1]-sum[i-1]<k)//i+o-1是从i点开始往后数o个数 ;i-1解释:求a~b之间的 素数个数=sum[b]-sum[a-1],a-1就相当于i-1
{
return false;
}
}
return true;
}
int main()
{
dabiao();
scanf("%d%d%d",&a,&b,&k);
int l=1,r=b-a+1;//根据题意设置左右区间
int ans=-1;//找不到的时候输出-1,所以初始化为-1
while(l<=r)//二分
{
mid=(l+r)/2;
if(judge(mid))
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%d\n",ans);
return 0;
}