1 条题解
-
0
符号约定
-
在数学中,我们用 表示求积运算,例如,可以使用 表示 。
-
为行文方便, 表示质因数出现次数大于等于 的质因数的个数。
题目分析
我们可以通过分解质因数和排列组合推理出一个数因数个数的求法。对于任何一个大于 的自然数 ,如果 不为质数,那么 可以唯一分解成有限个质数 的乘积:,这样的分解称为 的标准分解式。
所以, 的任意一个因数都可以表示为 $\prod \limits ^{n}_{k=1}P^{b_{k}}_{k}(0\leq b_{1}\leq a_{1},0\leq b_{2}\leq a_{2},0\leq b_{3}\leq a_{3},\dotsc ,0\leq b_{n} \leq a_{n})$。所以, 有 个因数。
因此,当且仅当一个数能用三个不同的质数 表示为 ,, 或 表示时,这个数恰有 个因数。我们的程序可以先对 分解质因数,并记录分解后各个质因数的表示为幂的形式时的次数,再遍历查询质因数超过对应次数的质因数并计算。
对于计算,实际也是排列组合。
- 能表示为 的数的个数,就是出现次数大于等于 的质因数的个数,即 。
- 能表示为 的数的个数,是出现次数大于等于 的质因数的个数和可选的出现次数大于等于 的质因数的个数之积。而出现次数大于等于 的质因数也包括在出现次数大于等于 的质因数内,所以需要舍去两个质因数相同的情况,即有 个数能表示为 。
- 同理,能表示为 的数有 个。
- 同理,去除重复的情况后,能表示为 的数有 个。
根据算数基本定理(唯一分解定理),上述的枚举不存在重复现象或遗漏现象。
代码
#include <iostream> using namespace std; int N,A[110]; //A[i] 表示 i 作为质因数出现的次数 void decompose(int num){ //对 num 分解质因数,并存储在数组 A 中 for (int i = 2;;i++){ while (num % i == 0){ A[i]++; num /= i; } if (num == 1) return ; } } int S(int num){ //遍历查询质因数出现次数大于等于 num 次的质因数的个数 int cnt = 0; for (int i = 2;i <= N;i++){ if (A[i] >= num) cnt++; } return cnt; } int main(){ cin >> N; for (int i = 2;i <= N;i++) decompose(i); cout << S(74) + S(24) * (S(2) - 1) + S(14) * (S(4) - 1) + S(4) * (S(4) - 1) * (S(2) - 2) / 2; } -
- 1
信息
- ID
- 11606
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 20
- 已通过
- 2
- 上传者