因数个数
参考:
https://matiji.net/exam/brushquestion/365/3846/4C6668FEB8CFD6520DE73B365B31D1A4
https://www.zhihu.com/question/50757823
问题引入
定义函数 的因数个数。
现在给定一个数 ,找到最小数字 满足 。如果 ,则输出 。
输入格式:
一行包含一个整数 n
输出格式:
输出一个整数 x
输入:
4
输出:
6
备注:
其中 1 n 100
问题分析
我的算法比较朴素哈。因为题目限定了 和 的范围,而且比较小,所以我就试着用了一下暴力循环的方法。
首先还是介绍一下本文的重点,找一个数的因数的个数。这是从知乎上看到的比较好的一个思想,也运用了排列组合的知识。
方法是:
先把这个数分解成质数幂次相乘的形式,然后把各个质因数的幂次加一再做相乘得到。
举个例子,比如 24 。
按照分解成质数幂次相乘的形式, ,那么24的因数个数就是 个。
为什么把幂次加一相乘就是总的因数的个数呢?这是因为把一个数分解成质因数相乘的形式之后,它所有的因数信息就全包括在里面了,因为所有的因数都能分解成这些质数相乘的形式。
把幂次加一代表的是某个因数中包含这个质因数个数的情况。
,它某个因数中包含2的情况只有3+1=4种,0个2,1个2,2个2,3个2,而包含3的情况只有1+1=2种,则这个因数所有的可能情况为4*2=8种,这8种包括了所有因数的可能情况,并且互不相同(这个互不相同是由分解成的形式中都是质因数的幂次相乘保证的,由于质因数间互质,所以每种情况对应的因数必定是不同的)。
以上均为知乎大佬的解释。
题解代码
很意外暴力循环可以ac。可能是因为准备了个质数表吧(其实质数表也是找的,可以用代码生成,但是有现成的就先用吧)。
1 | #拆解a,获取以i为底的指数次项 |
OvO