分段筛法:高效计算区间 [L, R] 内素数个数(附代码与思路详解)
```cpp #include <iostream> #include <vector> #include <cmath> using namespace std; int main() { long long L, R; cin >> L >> R; // 处理边界:确保L至少为2 if (L < 2) L = 2; if (R < 2) { cout << 0 << endl; return 0; } // 筛出[2, sqrt(R)]内的素数 int limit = sqrt(R); vector<bool> isPrimeSmall(limit + 1, true); vector<long long> primes; for (int i = 2; i <= limit; ++i) { if (isPrimeSmall[i]) { primes.push_back(i); for (int j = i * i; j <= limit; j += i) { isPrimeSmall[j] = false; } } } // 筛[L, R]区间 vector<bool> isPrimeLarge(R - L + 1, true); for (long long p : primes) { // 找到第一个大于等于L的p的倍数 long long start = max(p * p, (L + p - 1) / p * p); for (long long j = start; j <= R; j += p) { isPrimeLarge[j - L] = false; } } // 统计素数个数 int count = 0; for (long long i = L; i <= R; ++i) { if (isPrimeLarge[i - L]) { count++; } } cout << count << endl; return 0; } ``` 算法思路: 1. 使用埃拉托斯特尼筛法,但直接筛到2^31会超内存。 2. 利用区间长度≤10^6的特点,采用分段筛法: - 先筛出[2, sqrt(R)]内的所有素数 - 用这些素数去标记[L, R]区间内的合数 3. 注意处理L=1的特殊情况,1不是素数 4. 注意long long类型防止溢出 时间复杂度: O((R-L+1)loglogR + √R loglog√R) 空间复杂度: O(√R + (R-L+1)) 关键点: - 筛小素数时从i*i开始标记 - 筛大区间时从max(p*p, ceil(L/p)*p)开始标记 - 使用vector<bool>节省内存 ######[AI问答 | 559点数解答 | 2026-01-18 12:47:23]
- Python实现:随机录入45位学生四次成绩函数大揭秘(GPT | 477点数解答 | 2024-12-17 17:00:35)382
- Python实现班级45位同学成绩生成、总评计算及分数统计(字节豆包 | 579点数解答 | 2024-12-21 11:55:01)272
- Python实现45位学生四次成绩随机录入及输出(GPT | 441点数解答 | 2024-12-21 21:02:22)277
- Python实战:45位同学成绩生成、总评计算与分数统计揭秘(字节豆包 | 688点数解答 | 2024-12-22 10:14:17)265
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)271
- 巴黎奥运:中国女排淘汰赛对决土耳其,朱婷成致胜关键!(字节豆包 | 448点数解答 | 2024-08-06 15:59:48)188
- Java 实现通用文件存储系统:含随机读写与空闲空间回收(字节豆包 | 686点数解答 | 2024-11-21 16:25:51)252
- C++实现:输入整数英文单词算乘积,输出数字与英文结果,可多次计算!(GPT | 2268点数解答 | 2024-05-24 01:55:27)406
- C语言巧解:计算整数区间内最遥远素数差值(阿里通义 | 428点数解答 | 2024-11-22 14:53:33)196
- C++ 实现:根据给定序列与条件计算满足要求的整数对数量(字节豆包 | 232点数解答 | 2025-04-23 17:33:20)180
- C++ 求解满足特定条件整数对数量:从 O(M^2) 到 O(N + M) 的优化(百度文心 | 1197点数解答 | 2025-04-23 17:36:27)257
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)112