CodeForces 237C 筛素数+二分

本文介绍了一种通过预先筛选素数来优化后续查找的方法。该方法首先在一定范围内筛选出所有的素数,并将这些信息存储起来以供后续使用。在解决特定问题时,这种方法可以避免重复计算,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我一定不会承认在看到题解前根本没懂这题啥意思==

呜呜呜早知如此何必当初

筛素数,学长说二不二分无所谓。。

筛素数什么的就是提前把范围内所有素数都先存起来,之后要用到的时候直接用得了

#include<stdio.h>
#include<string.h>
#define max 1000010

int p[max],s[max],a,b,k;

void prime()
{
    for(int i=2;i<=max;i++)
    {
        s[i]=s[i-1];
        if(p[i])continue;
        s[i]++;
        for(int j=i+i;j<max;j+=i)
            p[j]=1;
    }
}

bool check(int mid)
{
    for(int i=a;i<=b-mid+1;i++)
    {
        if(s[i+mid-1]-s[i-1]<k)return 0;
    }
    return 1;
}

int main()
{
    prime();
    while(scanf("%d%d%d",&a,&b,&k)!=EOF)
    {
        int ans,l=1,r=b-a+1;
        if(s[b]-s[a-1]<k)
        {
            printf("-1\n");
            continue;
        }
        while(l<=r)
        {
            int mid=(l+r)/2;
            if(check(mid)){ans=mid;r=mid-1;}
            else l=mid+1;
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值