定义
每个大于$1$的自然数, 要么本身就是质数, 要么可写为$2$个或以上质数积, 且质因子排列顺序唯一
- $N = \prod_{i=1}^k p_i^{a_i}$ ($p_1< p_2 < …< p_k<N$且均为质数)
例, $6936=2^3317^2, 1200=2^435^2$
- 若 $N = \prod_{i=1}^k p_i^{a_i}$, 其因数有 $\prod_{i=1}^{k} (a_i+1)$ 个
证明
对于$p_1$部分来说, 分以下情况,
-
包含$0$个$p_1$时, $N$ 的因数$x_1 = p_2^{a_2}\cdots p_k^{a_k}$
-
包含$1$个$p_1$时, $N$ 的因数$x_2 = p_1^{1}p_2^{a_2}\cdots p_k^{a_k}$
$\cdots$
- 包含$a_1$个$p_1$时, $N$ 的因数$x_{a_1} = p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k}$
$p_1$部分总因数个数为$(a_1 + 1)$,
$p_2$部分总因数个数为$(a_2 + 1)$
$\cdots$
$p_i$部分总因数个数为$(a_i + 1)$
- $N$的因数个数为 $\prod_{i=1}^{k} (a_i + 1)$
例, $24 = 2 ^ 3 * 3 ^ 1$, 因数有$(3 + 1) * (1 + 1) = 8个$
求100!因数个数
#include<stdio.h>
typedef long long ll;
const int n = 100;
int main(void){
int b[101] = {0};
int x;
for (int i = 1; i <= n; i++) {
x = i;
for (int j = 2; j * j <= x; j++) {
// 当j是x的素因子时
while (x % j == 0) {
// m[j]表示素因子j的指数
b[j]++;
x /= j;
}
}
// 若x不为1说明其为素数
if (x != 1) {
b[x]++;
}
}
ll sum = 1;
for(int i = 1;i <= n ;i++){
if(b[i]){
sum *= b[i];
}
}
printf("%lld\n", sum);
return 0;
}