今天又考了三道题,本蒟蒻还是考得不好,第一次测我还暴零了,后来发现是编译器的问题。。。
这是codeforces上的题,链接Double Happiness,我们老师把它的名字改成了素数嘿嘿
【题目】
题目大意:
给出两个数L,R,找出[ L,R ]中的素数 t,满足t=+(a,b为任意正整数),输出[ L,R ]中这种数的个数
输入格式:
两个正整数 L 和 R
输出格式:
[ L,R ] 中满足题意的数的个数
样例数据:
输入
6 66
输出
7
备注:
数据范围与约定:
对于30%的数据,L,R≤200。
对于70%的数据,L,R≤100000。
对于100%的数据,1≤L<R≤ 。
【分析】
首先,素数中唯一的一个偶数2肯定满足题意(2 = + )
我们接下来思考对于奇数该怎么办
由于大于 2 的素数都为奇数,因此 和 是一奇一偶,那么 和 也是一奇一偶,不妨假设偶数为 ,奇数为 ,那么 + = + ,化简得到 4 + 4 + 4 + 1,它可以表示成 ,容易看出前面的一堆是 4 的倍数,后面的 是奇数,不是 2 的倍数,因此表示成 ()就可以了
那我们实际上就是求 [ L,R ] 中能表示成 ()的素数有多少个
由于 L,R 最大有 ,用数组的话会超出128M的空间,所以我们用一个神奇东西 bitset 来存储信息
【代码】
#include<bitset>
#include<cstdio>
using namespace std;
bitset<300000000>f; //这是个神奇东西,大家可以去百度搜一下
int main()
{
// freopen("prime.in","r",stdin);
// freopen("prime.out","w",stdout);
int l,r,i,j,s=0;
scanf("%d%d",&l,&r);
if(l<=2&&r>=2) s=1; //特判2这个数
for(i=3;i*i<=r;i+=2) //筛素数
if(!f[i])
for(j=i*i;j<=r;j+=2*i)
f[j]=1;
for(i=5;i<=r;i+=4) //用4*k+1来筛
if(i>=l&&!f[i])
s++;
printf("%d",s); //输出答案
// fclose(stdin);
// fclose(stdout);
return 0;
}