以下摘要由GPT-4o生成 : 题目要求计算正整数 N 的每个数的最小质因子的总和,即求和 $\sum\limits_{i=2}^N F(i)$。输入中包含多个测试数据,数量 T 可达 10^6,而 N 的范围为 2 到 2×10^7。为了高效解决问题,可以采用线性筛法(或欧拉筛),其相较于传统的试除法具有更好的性能表现,能够在较短时间内完成质因子的计算并输出结果。
题目链接[15.最小质因子之和(Hard Version) - 蓝桥云课 ]
题目描述 定义 F(i) 表示整数 i 的最小质因子。现给定一个正整数 N ,请你求出 $\sum\limits_{i=2}^N F(i)$
输入描述 第 11 行为一个整数 T ,表示测试数据数量。
接下来的 T 行每行包含一个正整数* N*。
$1≤T≤10^6,2≤N≤2×10^7。$
输出描述 输出共 T 行,每行包含一个整数,表示答案。
输入输出样例 示例 1
输入
输出
普通素数的求法(试除法) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <iostream> #include <cmath> using namespace std;const int max_n = 2e7 ;int minp[max_n + 1 ];long long sum[max_n + 1 ];void precompute () { for (int i = 2 ; i <= max_n; ++i) { bool is_prime = true ; for (int j = 2 ; j <= sqrt (i); ++j) { if (i % j == 0 ) { minp[i] = j; is_prime = false ; break ; } } if (is_prime) minp[i] = i; } } int main () { precompute (); for (int i = 2 ; i <= max_n; ++i) { sum[i] = sum[i-1 ] + minp[i]; } int T; cin >> T; while (T--) { int N; cin >> N; cout << sum[N] << endl; } return 0 ; }
线性筛质数(欧拉筛) 前置知识:[算术基本定理_百度百科 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include <iostream> using namespace std;const int max_n = 2e7 ;int minp[max_n + 1 ]; long long sum[min_n + 1 ]; bool st[max_n + 1 ]; int primes[max_n]; int cnt;void get_minp () { for (int i = 2 ; i <= max_n; i++) { if (!st[i]) { primes[cnt++] = i; minp[i] = i; } for (int j = 0 ; j < cnt && primes[j] * i <= max_n; j++) { int t = primes[j] * i; st[t] = true ; minp[t] = primes[j]; if (i % primes[j] == 0 ) break ; } } } int main () { get_minp (); sum[0 ] = sum[1 ] = 0 ; for (int i = 2 ; i <= max_n; i++) { sum[i] = sum[i-1 ] + minp[i]; } int T; cin >> T; while (T--) { int N; cin >> N; cout << sum[N] << endl; } return 0 ; }
对比:线性筛法的优势
方法
预处理时间
查询时间
适用规模
试除法
O (N *sqrt( N ))
O (1)
N ≤ 10^4
线性筛法
O (N )
O (1)
N ≤ 2×10^7