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;
}