题意:求[L,R)区间内的质数个数 (2<=L<R<=10^12 , R-L<=10^6)
题解: 运用类似埃式筛法的原理,因为lr太大了连数组都开不下,数组就-l存好了。
还有一个基本原理就是n如果不是质数,在2-√n的范围内肯定有质因子
代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#define LL long long
using namespace std;
bool ss[1000005],sc[1000005];
LL l,r;
void prime()
{
for (int i=2;i<=sqrt(r);i++)
if (!ss[i])
{
for (int j=2*i;j<=sqrt(r);j+=i)
ss[j]=true;
for (LL j=max(2LL,(l+i-1)/i*i);j<r;j+=i)//(a+i-1)/i为[a,b)区间内的第一个数至少为i的多少倍.
sc[j-l]=true;
}
}
int main()
{
scanf("%I64d%I64d",&l,&r);
prime();
int cnt=0;
for (int i=0;i<r-l;i++)
if (!sc[i]) cnt++;
if (l==0) cnt-=2;
if (l==1) cnt--;
printf("%d",cnt);
}