大区间内素数(数论)

来源:互联网 发布:室内设计上海知乎 编辑:程序博客网 时间:2024/05/16 09:21

题意:求[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 longusing 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);}


原创粉丝点击