n! 与组合数的素因子分解
阶乘和组合数的素因子分解不同于一般的素因子分解,不同之处就在于枚举的不是每个数的所有素因子,而是每个素因子包含哪些数。
n!的素因子分解
首先筛选出所有 [1,n] 的素数,然后对于一个素数 prime[i],[1,n] 中有因子 prime[i] 的一定是形如:prime[i], 2 * prime[i] ,3 * prime[i] ,...第一轮我们得到的是 n/prime[i] 个因子,并且将 n 变成 n/prime[i],这样一直到 n 等于 0 的时候就可以求出所有 n! 的 prime[i]的因子了。
这里应用了递归思想:
假设我们以 9! 求解 2 这个素因子的个数为例:
含有2这个素因子的数字有:
计算过程:
核心思想是看 [2,n] 中含 m^t 次方的个数,含 m,m^2....., 有多少个加几。和就为最后的结果。
贴个代码,不是我写的。。。
组合数的素因子分解
根据组合数公式
可以将三个阶乘的素因子组合起来,个数进行加减运算(乘加除减)。具体的实现还是参照下面的题目吧。(太懒了,不想写了。。。)
题目
下面以FZU1753为例:
这个题目是求解多个组合数公共素因子的个数,根据上面组合数分解的算法,就可以很容易写出来了。至于题目为什么要进行素因子分解,因为组合数太大了。
还有题目需要进行一些优化。我们要求解 公共 因子的个数,所以只求出最小的那个组合数之间的公因子个数就行了,大于它的素数因子个数的求解就没有意义了。