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.
思路:数学加二分可解决
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
int flag[1000002]={1,1},sum[1000004],v,a,b,k;
void inti()
{
for(int i = 2;i <= 1000;i ++)
{
if(!flag[i])
{
for(int j = i * i;j <= 1000000;j += i)
flag[j] = 1;
}
}
}
bool fun(int x)
{
int ans = 0;
for(int i = x;i < v;i ++)
if(sum[i] - sum[i - x] < k)
{
ans = 1;
break;
}
if(ans) return false;
return true;
}
int main()
{
inti();
while(~scanf("%d %d %d",&a,&b,&k))
{
v = 1;
if(b - a + 1 < k) puts("-1");
else
{
for(int i = a;i <= b;i ++)
{
if(flag[i] == 0)
sum[v] = sum[v - 1] + 1;
else
sum[v] = sum[v - 1];
v ++;
}
int start = 1,end = v - 1,ans = 0;
while(start <= end)
{
int mid = (start + end) / 2;
if(fun(mid))
{
end = mid;
if(start == end) {ans = 1;break;}
}
else
start = mid + 1;
}
if(ans == 0) puts("-1");
else printf("%d\n",start);
}
}
return 0;
}