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;
}
分析: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;
}
相关文章推荐
- Codeforces 237C:Primes on Interval(素数打表+二分)
- Codeforces 237C Primes on Interval(素数统计)
- 【CodeForces】237C - Primes on Interval(二分)
- Primes on Interval(素数打表+二分)
- Primes on Interval
- Codeforces 237C (Primes on Interval)二分
- CodeForce 237C Primes on Interval(二分+ 素数筛法)
- 237C - Primes on Interval
- CodeForces-237C- Primes on Interval
- codeforces 237C.Primes on Interval
- CodeForces 237C Primes on Interval(数学加二分)
- CodeForces 237C Primes on Interval
- cf273C. Primes on Interval【二分】
- Primes on Interval+codeforces+筛选法打表
- Primes on Interval(二分 + 素数打表)
- codeforce 237 C. Primes on Interval
- 【Codeforcdes 237C. Primes on Interval】+ 二分
- Primes on Interval
- ZCMU-1022-Primes on Interval
- codeforces 237C. Primes on Interval(二分)