237C - Primes on Interval

题目意思是,对于在区间[a,b-l+1]中的每个数x,都有连续的l个数:x,x+1,x+2,x+l-1使得这其中至少存在k个素数,求最小的l 。

首先打个表,然后判断在区间[a,b]中是否存在k个素数,如果不存在,输出-1。

然后再从i = a->b 开始计算区间大小l使得[i,i+l-1]中至少有k个素数。

如果i+1对于l不能满足如上关系,那么更新l的值。

#include <iostream>
#include<stdio.h>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 10000000
using namespace std;
int a,b,k,c,l;
int vis[1000010],prim[10000000];

void biao()
{
    int m = sqrt(b+0.5);
    c = 0;
    memset(vis,0,sizeof vis);
    for(int i = 2;i <= m;i++)if(!vis[i])
        for(int j = i*i;j <= b;j+=i)vis[j] = 1;
    for(int i = 2;i<=b;i++) if(!vis[i]) {prim[c++] = i;}
}

int main()
{
    scanf("%d %d %d",&a,&b,&k);
    biao();
    l = -1;
    int pos = lower_bound(prim,prim+c,a)-prim;
    if(pos+k-1 >= c) l = -1;
    else{
        for(int i = a;i <= b;i++)
        {
            int pos = lower_bound(prim,prim+c,i)-prim;
            if(pos+k-1 >= c) {l = b - i +2;if(l> b-a+1) l = -1; break;}
            else
            {
                int y = prim[pos+k-1];
                if(y - i +1> l) l = y - i+1;
            }
            if(i == b - l + 1)break;
        }
    }
    printf("%d\n",l);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值