当前位置:   article > 正文

算法提高 找素数

算法提高 找素数
问题描述
  给定区间[L, R] , 请计算区间中素数的个数。
输入格式
  两个数L和R。
输出格式
  一行,区间中素数的个数。
样例输入
2 11
样例输出
5
数据规模和约定
  2 <= L <= R <= 2147483647 R-L <= 1000000


  1. #include <iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. using namespace std;
  8. typedef long long ll;
  9. const int inf=2147483647;
  10. const int maxn=1e5+100;
  11. int pri[maxn];
  12. int ans[maxn*10];
  13. /*
  14. 复杂度大约是2e6,思维真的是强
  15. 我只是想到了筛,但是一看到1e9,自己就蒙了
  16. 还是固化的思维太重,不去看别的条件,要知道考试
  17. 是不会让你见到原题的,只会有新的思维,这些都是铺垫
  18. */
  19. int main()
  20. {
  21. ll l,r;
  22. scanf("%lld %lld",&l,&r);
  23. int m=sqrt(r+0.5);
  24. for(ll i=2;i<=m;i++){
  25. if(pri[i])continue;
  26. for(ll j=i*i;j<=m;j+=i)
  27. pri[j]=1;
  28. ll pos=l/i;
  29. if(l%i)pos++;
  30. for(ll j=max(i+i,pos*i);j<=r;j+=i)
  31. ans[j-l]=1;
  32. // printf("i:%lld pos:%lld\n",i,pos);
  33. }
  34. //printf("m:%d\n",m);
  35. // for(int i=1;i<=m;i++)printf("i:%d %d\n",i,pri[i]);
  36. int cnt=0;
  37. for(int i=0;i<=r-l;i++)if(!ans[i])cnt++;
  38. printf("%d\n",cnt);
  39. return 0;
  40. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号