XMU 1246

http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1246

求区间内素数个数,经典问题,区间长度10^6,数的取值最多能到10^12(此题范围稍小)

用筛法搞出[2,根号b]范围内的素数,用这些素数再去筛[a,b]

一个吐血的trick,1不是素数

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std ;

typedef long long ll ; 

bool prime[1500000] ;

bool prime1[1500000] ;

int main()

{

    int t ;

    scanf("%d",&t) ;

    while(t--)

    {

        ll a,b ;

        scanf("%lld%lld",&a,&b) ;

        for(ll i=0 ;i*i<=b ;i++)prime[i]=true ;

        for(ll i=0 ;i<=b-a ;i++)prime1[i]=true ;

        for(ll i=2 ;i*i<=b ;i++)

        {

            if(prime[i])

            {

                for(ll j=2*i ;j*j<=b ;j+=i)prime[j]=false ;

                for(ll j=max(2LL,(a+i-1)/i)*i ;j<=b ;j+=i)prime1[j-a]=false ;

            }

        }

        int ans=0 ;

        for(ll i=0 ;i<=b-a ;i++)

            if(prime1[i])ans++ ;

        if(a==1)ans-- ;

        printf("%d\n",ans) ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(XMU 1246)