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(1 ≤ L≤ b - a + 1)满足对于[a, b-L+1]中的任意一个数X,在[X, X+L-1]这L个数中,至少有k个素数。如果不存在满足条件的L,输出-1.解题思路:首先判断是否有解,即判断当L=b-a+1时是否有解,因此时L最大,若此时都无解,则肯定无解。
若有解,则1 ≤ L≤ b - a + 1,二分求最小的L即可。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 1e6 + 10; int preim[maxn],cnt[maxn]; bool vis[maxn]; void get_prime() { memset(vis,false,sizeof(vis)); vis[0] = true; vis[1] = true; for(int i = 2; i <= maxn; i++) { if(vis[i] == true) continue; for(int j = 2 * i; j <= maxn; j += i) vis[j] = true; } cnt[0] = 0; for(int i = 1; i <= 1000000; i++) { if(vis[i] == false) cnt[i] = cnt[i-1] + 1; else cnt[i] = cnt[i-1]; } } bool judge(int x,int y,int k,int l) { int r = y - l + 1; for(int i = x; i <= r; ++i) { if(cnt[i+l-1] - cnt[i-1] >= k) continue; else return false; } return true; } int get_ans(int a,int b,int k) { int L = 1, R = b - a + 1, mid; while(L <= R) { mid = (L + R) / 2; if(judge(a,b,k,mid)) R = mid - 1; else L = mid + 1; } return L; } int main() { get_prime(); int a,b,k; while(~scanf("%d%d%d",&a,&b,&k)) { if(!judge(a,b,k,b - a + 1)) printf("-1\n"); else printf("%d\n",get_ans(a,b,k)); } return 0; }