给你三个数,a,b,k让你求出最小的l满足:对于任意的x属于 (a ≤ x ≤ b - l + 1)中至少含有K个素数。
思路:
二分答案。
#include <bits/stdc++.h>
using namespace std;
bool notprime[1000010];
int num[1000010];
int a, b, k;
void init() {
notprime[0] = notprime[1] = true;
for (int i = 2; i <= 1000005; i++) {
if (notprime[i]) continue;
for (int j = 2*i; j < 1000005; j += i) {
notprime[j] = true;
}
}
num[0] = 0;
for (int i = 1; i <= 1000005; i++) {
num[i] = num[i - 1] + !notprime[i];
}
}
bool judge(int x) {
for (int i = a; i <= b - x + 1; i++) {
if (num[i + x - 1] - num[i - 1] < k)
return false;
}
return true;
}
int main() {
int ans; init();
while (scanf("%d%d%d", &a, &b, &k) != EOF) {
ans = -1;
int lb = 1, ub = b - a + 1;
while (ub >= lb) {
int mid = (ub + lb) >> 1;
if (judge(mid)) {
ans = mid; ub = mid - 1;
}
else lb = mid + 1;
}
printf("%d\n", ans);
}
return 0;
}