Codeforces 237C Primes on Interval 【二分】

来源:互联网 发布:越南看电视的软件 编辑:程序博客网 时间:2024/04/29 19:33

题目链接:Codeforces 237C Primes on Interval

C. Primes on Interval
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
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.

Examples
input
2 4 2
output
3
input
6 13 1
output
4
input
1 4 3
output
-1

题意:让你找到最小的l满足1 <= l <= b - a + 1,使得对于任意的x(a <= x <= b - l + 1)均有[x, x + l - 1]里面至少有k个质数。

思路:推敲下,会发现l是单调的,那么直接二分就好了。

AC代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <map>#include <set>#include <string>#include <queue>#define CLR(a, b) memset(a, (b), sizeof(a))#define fi first#define se secondusing namespace std;typedef long long LL;typedef pair<int, int> pii;const int MAXN = 1e6 + 1;const int MOD = 1073741824;const int INF = 0x3f3f3f3f;void add(LL &x, LL y) { x += y; x %= MOD; }bool vis[MAXN];int sum[MAXN];void getvis() {    vis[1] = true;    for(int i = 2; i < MAXN; i++) {        if(vis[i]) continue;        for(int j = 2*i; j < MAXN; j += i) {            vis[j] = true;        }    }    sum[0] = 0;    for(int i = 1; i < MAXN; i++) {        sum[i] = sum[i-1] + (vis[i] == false);    }}bool judge(int o, int a, int b, int k) {    for(int i = a; i <= b - o + 1; i++) {        if(sum[i+o-1] - sum[i-1] < k) return false;    }    return true;}int main(){    getvis();    int a, b, k;    while(scanf("%d%d%d", &a, &b, &k) != EOF) {        int l = 1, r = b - a + 1;        int ans = -1;        while(r >= l) {            int mid = (l + r) >> 1;            if(judge(mid, a, b, k)) {                ans = mid;                r = mid - 1;            }            else {                l = mid + 1;            }        }        printf("%d\n", ans);    }    return 0;}
0 0
原创粉丝点击