#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1000005;
bool is_prime[maxn];
bool is_prime_small[maxn];
ll prime[maxn];
ll prime_num=0;
ll max(ll a,ll b)
{
if(a>b) return a;
else return b;
}
void segment_sieve(ll a,ll b)
{
for( ll i=0;i*i<b;i++)
{
is_prime_small[i]=true;
}
for(ll i=0;i<b-a;i++)
{
is_prime[i]=true;
}
for(ll i=2;i*i<b ;i++)
{
if(is_prime_small[i])
{
for(ll j=i*2;j*j<b;j+=i) is_prime_small[j]=false;
for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;
}
}
for(ll i=0;i<b-a;i++)
{
if(is_prime[i]) prime[prime_num++]=i+a;
}
}
int main()
{
int a,b;
while(scanf("%d%d",&a,&b)!=EOF)
{
memset(prime,0,sizeof(prime));
prime_num=0;
segment_sieve(a,b);
printf("%lld\n",prime_num);
}
return 0;
}
素数的区间筛法
最新推荐文章于 2023-12-09 19:46:22 发布