CodeForce 237C Primes on Interval(二分+ 素数筛法)
题目链接:http://codeforces.com/problemset/problem/237/C
Primes on Interval time limit per test 1 second memory limit per test 256 megabytesYou'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.
InputA single line contains three space-separated integers a, b, k (1 ≤ a, b, k ≤ 106; a ≤ b).
OutputIn 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题意:给出三个正整数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 <iostream> #include <cstring> #include <set> #include <cmath> using namespace std; typedef long long LL; const int MaxN = 1e6 + 2; int prime[MaxN], vis[MaxN], cnt[MaxN]; int pri_cnt;//筛法求素数 void get_prime() {int m = (int)sqrt(1000000 + 1);pri_cnt = 0;memset(vis, 0, sizeof(vis));vis[0] = 1;vis[1] = 1;for(int i = 2; i <= m; ++i) {if(!vis[i]) {prime[pri_cnt++] = i;for(int j = i * i; j <= 1000005;j += i)vis[j] = 1;}} }//预处理求出1-1000000所有的素数,保存在prime数组中,并用cnt[i]数组记录从0到i有多少个素数 void Init() {get_prime();cnt[0] = 0;for(int i = 1; i <= 1000000; ++i) {if(!vis[i]) cnt[i] = cnt[i-1] + 1;else cnt[i] = cnt[i-1];} }// 判断当前的l是否满足题目要求 bool Check(int a, int b, int k, int l) {int r = b - l + 1;for(int i = a; i <= r; ++i) {if(cnt[i + l - 1] - cnt[i - 1] >= k)continue;elsereturn false;}return true; }// 二分求最小的L 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(Check(a, b, k, mid))R = mid - 1;elseL = mid + 1;}return L; }int main() {Init();int a, b, k;while(~scanf("%d%d%d", &a, &b, &k)) {if(!Check(a, b, k, b - a + 1))printf("-1\n");elseprintf("%d\n", get_ans(a, b, k));}return 0; }总结
以上是生活随笔为你收集整理的CodeForce 237C Primes on Interval(二分+ 素数筛法)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 一文彻底搞懂Cookie、Session
- 下一篇: CodeForce 236B Easy