codeforces - 273C Prime on Interval 【二分】
题意:
给你三个数,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; }