组合数的计算
今天在刷牛客网的题目的时候,与到一个要计算组合数的题目 网易_2019校招真题在线编程_小易的字典_牛客网 发现组合数并没有想象中的好算。因此记录一下,如何计算组合数。
最简单的方法
直接使用公式
C m n = n ! m ! ( n − m ) ! C^n_m = \frac{n!}{m!(n-m)!} Cmn=m!(n−m)!n!
只需要分别计算三个阶乘 n ! n! n!、 m ! m! m!、 ( n − m ) ! (n-m)! (n−m)!,之后在将它们按照公式操作就好。
计算阶乘时可以使用动态规划来减少重复计算。但是这种方式只能计算很有限的一些 n 和 m 的组合
更高效的方法
上面的方法只可以计算比较小的数字,遇到大的数字就产生溢出。因为它是分别计算了三个很大的数字之后再对他们做除法。
这种方法有很多没有必要的计算,我们对上面的组合数公式进行化简
C m n = n ( n − 1 ) … ( m + 1 ) ( n − m ) ( n − m − 1 ) … 1 C^n_m = \frac{n(n-1) \dots (m+1)}{(n-m) (n-m-1) \dots 1} Cmn