I.cpp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M = 50000 + 10;//sqrt(R)+1
  4. vector<int> primes = {2, 3,};
  5. void fill(int m) {
  6. for (int k = primes.back(); k <= m; k += 2) {
  7. bool flag = true;
  8. for (int p:primes) {
  9. if (p * p > k)break;
  10. if (k % p == 0) {
  11. flag = false;
  12. break;
  13. }
  14. }
  15. if (flag)primes.push_back(k);
  16. }
  17. }
  18. int main() {
  19. int l = 2100000000, r = 2101000000;
  20. cin>>l>>r;
  21. int m = sqrt(r) + 1;
  22. fill(m);//把 1~sqrt(r)素数都放在数组primes里
  23. if (l < 2)l = 2;//小技巧
  24. bool B[r - l + 1];// x+L 是合数 则把 B[x]=false 区间筛法
  25. fill(B, B + r - l + 1, true);
  26. for (auto p:primes) {
  27. for (int x = (l + p - 1) / p * p; x <= r; x += p) {
  28. if (x % p == 0 and x > p)//p是x的非平凡因子
  29. {
  30. B[x - l] = false;//映射
  31. }
  32. }
  33. }
  34. int tot = 0;
  35. for (int x = l; x <= r; x++)
  36. if (B[x - l])++tot;
  37. cout << tot << endl;
  38. return 0;
  39. }