BNU E. 比比谁更虎

E. 比比谁更虎

1000ms
1000ms
65535KB
 
64-bit integer IO format: %lld      Java class name: Main
Font Size:

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 ",cnt);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/lxm940130740/p/3360216.html