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
2 4 2
3
6 13 1
4
1 4 3
-1
#include<algorithm> #include<stdio.h> #include<string.h> using namespace std; #define maxn 1000005 int p[maxn]= {0}; //前i位有sum[i]个素数 int d[maxn];//是素数标记为1,否则标记为0 int a,b,k; void shaifa() { int i,j; d[0]=d[1]=1; for(i=2; i<maxn; i++) { p[i]=p[i-1]; if(!d[i]) { p[i]++; for(j=2*i; j<maxn; j+=i)//或者:for(j=1;i*j<maxn;j++){d[i*j]=1;} { d[j]=1; } } } } bool check(int x)//传入二分查找的中间值 { for(int i=a; i<=b-x+1; i++) if(p[i+x-1]-p[i-1]<k)//此区间的素数小于k return 0; return 1;//满足条件返回1 } int main() { shaifa(); while(~scanf("%d%d%d",&a,&b,&k)) { if(p[b]-p[a-1]<k)//取极限,如果不满足条件 { printf("-1\n"); return 0; } int left=1;//左边界 int right=b-a+1;//右边界 int num; while(left<=right)//二分查找 { int mid=(left+right)/2;//中间值 if(check(mid))//满足条件 { num=mid; right=mid-1;//缩小范围继续查找 } else left=mid+1;//改变左边界 } printf("%d\n",num); } }