E. 比比谁更虎
beap~高,beap~帅,beap~富,beap~无烦恼。
一直以来beap都是个霸气侧漏的人,所以他经常和别人比做题的速度,据说下面这个问题,他仅仅用了1分30秒便秒杀了。你能比身为“秒神”的他更虎吗?
问题如下:
求L到R之间的素数的个数(包括L,R),
其中0 < L,R < 10^9,但R-L的值不会超过10^6 。
Input
处理到文件末尾,每组输入只有一行,包括两个数L,R 。
Output
每组测试数据的输出只有一个整数,表示素数个数。
Sample Input
1 5
5 10
Sample Output
3
2
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int vit[32000];
int num[10000];
bool flag[1000006];
int L,R,len;
int main()
{
int i,j;
memset(vit,0,sizeof(vit));
vit[1]=0;
vit[2]=1;
for(i=3; i<=32000; i++)
{
if(i%2)
vit[i]=1;
else
vit[i]=0;
}
for(i=3; i<=32000; i+=2)
{
if(vit[i])
{
for(j=i*2; j<=32000; j+=i)
vit[j]=0;
}
}
int cat=0;
for(i=2; i<=32000; i++)
{
if(vit[i])
{
num[cat++]=i;
}
}
while(~scanf("%d%d",&L,&R))
{
if(R<L) swap(R,L);
memset(flag,false,sizeof(flag));
for(int i=0; i<cat && i<=R; i++)
{
int dd=L/num[i];
int ss=num[i]*dd;
if(ss<L)
dd++;
if(dd==1)
dd++;
for(int j=dd; j*num[i]<=R; j++)
{
flag[j*num[i]-L]=true;
}
}
int cnt=0;
for(int i=0; i<R-L+1; i++)
{
if(!flag[i])
cnt++;
}
if(L<=1)
cnt--;
printf("%d\n",cnt);
}
return 0;
}