七、2019 ICPC 南昌—C题 3 numbers【2019.12.7】

C— < 3 numbers
类型:思维(数学题) 难度:?
教训:不能迷信板子,导致一看到有“素数”出现的题目就反射性地想套板子,套各种筛法不管三七二十一先筛几个质数出来,应该先根据常数限制判断方法(暴力还是特殊)
特殊解法的可能方式:特判,找规律,直接有公式套用
这道题时间限制1秒,范围10亿,因此100%不可能暴力做,只能想方法找规律特判。
PS1:这道题的测试数据很弱,有些能卡掉我区区15个质数的特殊大质数明显没有。
PS2:刚开始以为是几千几万后特判所有,原来只用到49就可以了
PS3:还有要注意的就是r-l<3的时候也要特判循环一下
PS4:百度了一下才知道还有素数密度这种公式。。不过这么复杂的公式打出来也得好一会吧(还是要学会的)
在这里插入图片描述
优化过后的最简代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
int b[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
bool prime(int x)
{
    for(int i=0;i<15;i++)
        if(x%b[i]==0&&x!=b[i])
            return 0;
    return 1;
}
int main()
{
    int t,l,r,sum,flag,len;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&l,&r);
        if(l==r)
        {
            if(l==1||prime(l)==1)
                printf("No\n");
            else if(prime(l)==0)
                printf("Yes\n");
        }
        else 
        {
            sum=0;len=r-l+1;
            if(l==1)
                l=2,sum=1;
            if(r>=49&&r-l>3)//临界点
                printf("Yes\n");
            else
            {
                for(int i=l;i<=r;i++)
                {
                    flag=0;
                    if(prime(i)==1)
                        sum++;
                    if(sum*3>=len)
                    {
                        printf("No\n");
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                    printf("Yes\n");
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值