欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForce 237C Primes on Interval(二分+ 素数筛法)

发布时间:2025/3/16 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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 megabytes

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 aa + 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 xx + 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
题意:给出三个正整数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(二分+ 素数筛法)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。