题意
给出 N N ,求出的质因子和它们的个数。
思路
如果直接分解
1∼N
1
∼
N
的质因子,时间复杂度很大,我们可以考虑别的做法。
因为
N!=1∗2∗3∗...∗N
N
!
=
1
∗
2
∗
3
∗
.
.
.
∗
N
,所以
N!
N
!
的质因子不会超过
N
N
,我们就可以先筛出的质数,然后判断
N!
N
!
的质因子的个数。
N!
N
!
中的质数
p
p
的个数就为中包含质因子
p
p
的个数的和,那么显然在中包含一个质因子
p
p
的数的个数为个,然后我们可以判断含两个质因子
p
p
的数,那么这个的数量就为。
综上所述,
N!
N
!
中质因子
p
p
的个数为:
代码
#include<cmath>
#include<cstdio>
int n, m, v[1000001], prime[1000001], c[1000001];
void calc_prime(int n) {
for (int i = 2; i <= n; i++) {
if (!v[i]) {
v[i] = i;
prime[++m] = i;
}
for (int j = 1; j <= m; j++) {
if (prime[j] > v[i] || prime[j] > n/i) break;
v[i * prime[j]] = prime[j];
}
}
}
int main() {
scanf("%d", &n);
calc_prime(n);
for (int i = 1; i <= m; i++)
for (long long x = prime[i]; x <= n; x *= prime[i])
c[prime[i]] += n / x;
for (int i = 1; i <= m; i++) printf("%d %d\n", prime[i], c[prime[i]]);
}