您的位置:首页 > 其它

Primes on Interval

2013-07-13 15:21 369 查看
题意:找到最小的一个在[1, b - a+ 1]上的数l , 使得属于[a, b - l + 1]上的所有x满足[x, x + l - 1]都至少有k个素数。 

分析:l越小, x变多, 同时x +l - 1上的素数也越少。所以可以二分l找到最小值。  预处理素数。

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#define MAX 1005
#include <complex>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <string>
#define INF 1e8
#define MAX (int)1e6+ 5
using namespace std;
bool notPrime[MAX];
void makePrime(){
notPrime[0] = notPrime[1] = true;
for(int i = 2; i < sqrt(MAX); i++){
if(!notPrime[i])
for(int j = i * 2; j < MAX; j+= i){
notPrime[j] = true;
}
}
// for(int i = 0; i < 100; i++){
// if(!notPrime[i])cout<<i<<endl;
// }
}
int a, b, k;
bool check( int key){
int ans = 0;
for(int i = a; i <= a + key - 1; i++){
if(!notPrime[i])ans++;
}
if(ans < k)return false;
for(int i = a + key; i <= b; i++){
if(!notPrime[i])ans ++;
if(!notPrime[i - key])ans--;
if(ans < k)return false;
}
return true;
}
void b_search(){
int l = 0, r = b - a + 2;
while(l + 1 < r){
int mid = (l + r)>>1;
if(check(mid)){
r = mid;
}else {
l = mid;
}
}
if(r > 0 && r < b - a + 2)cout<<r<<endl;
else puts("-1");
}
int main()
{
makePrime();
while(cin>>a>>b>>k){
b_search();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CF