题目-阶乘分解

问题分析
对于质数 p p p, 计算 1 × 2 × 3 × 4... × n 1 \times 2 \times 3 \times 4 ... \times n 1×2×3×4...×n中 p p p出现的次数
a n s = n p + n p 2 + n p 3 + . . . + n p k ans = \frac{n}{p} + \frac{n}{p ^ 2} + \frac{n}{p ^ 3} + ... + \frac{n}{p ^ k} ans=pn+p2n+p3n+...+pkn, 同时 n n n是迭代的, 也就是说n /= p
算法步骤
输入 n n n, 计算 [ 1 , n ] [1, n] [1,n]之间出现的质数, 然后分别使用上述的公式计算 p p p出现的次数
输出即可, 算法时间复杂度瓶颈在处理质数, O ( n ) O(n) O(n)
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int primes[N], cnt;
bool st[N];
void init(int k) {
for (int i = 2; i <= k; ++i) {
if (!st[i]) primes[cnt++] = i;
for (int j = 0; i * primes[j] <= k; ++j) {
st[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
init(n);
for (int i = 0; i < cnt; ++i) {
int p = primes[i];
int cnt = 0;
for (int j = n; j; j /= p) cnt += j / p;
if (cnt == 0) continue;
cout << p << ' ' << cnt << '\n';
}
return 0;
}

京公网安备 11010502036488号