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