Codeforces Round #147 (Div. 2) C. Primes on Interval 二分

C. Primes on Interval

链接:

http://codeforces.com/contest/237/problem/C

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <map>
 9 #include <set>
10 #include <stack>
11 #include <queue>
12 #include <functional>
13 using namespace std;
14 #define rep(i,a,n) for (int i=a;i<=n;i++)
15 #define per(i,a,n) for (int i=n;i>=a;i--)
16 #define pb push_back
17 #define mp make_pair
18 #define all(x) (x).begin(),(x).end()
19 #define fi first
20 #define se second
21 #define SZ(x) ((int)(x).size())
22 typedef vector<int> VI;
23 typedef long long ll;
24 typedef pair<int, int> PII;
25 const ll mod = 1000000007;
26 // head
27 
28 const int maxn = 1e6 + 7;
29 int prime[maxn];
30 int a, b, k;
31 
32 void IsPrime() {
33     prime[0] = prime[1] = 0; prime[2] = 1;
34     for (int i = 3; i<maxn; i++)
35         prime[i] = i % 2 == 0 ? 0 : 1;
36     int t = (int)sqrt(maxn*1.0);
37     for (int i = 3; i <= t; i++)
38         if (prime[i])
39             for (int j = i*i; j<maxn; j += 2 * i)
40                 prime[j] = 0;
41 }
42 
43 bool check(int m) {
44     rep(i, a, b - m + 1) if (prime[i + m - 1] - prime[i - 1] < k) return false;
45     return true;
46 }
47 
48 int main()
49 {
50     IsPrime();
51     cin >> a >> b >> k;
52     rep(i, a, b) prime[i] = prime[i - 1] + prime[i];
53     prime[a - 1] = 0;
54     int l = 1, r = b - a + 1, ans = maxn;
55     while (l <= r) {
56         int mid = (l + r) / 2;
57         if (check(mid)) {
58             r = mid - 1;
59             ans = mid;
60         }
61         else l = mid + 1;
62     }
63     if (ans == maxn) cout << -1 << endl;
64     else cout << ans << endl;
65     return 0;
66 }
原文地址:https://www.cnblogs.com/baocong/p/6432925.html