组合数
定义
我们定义 $C_n^m$ 为在 $n$ 个元素中选择 $m$ 个元素的不同的组合方式,即组合数。
性质
1.计算公式:
$$C_n^m=\frac{n!}{m!(n-m)!} $$
我们记 $A_n^m$ 为在 $n$ 个元素中选 $m$ 个元素的不同的排列方式,即排列数。
我们易得:
$$A_n^m=n(n-1)(n-2)(n-3)…(n-m+1)=\frac{n!}{(n-m)!}$$
则有:
$$C_n^m=\frac{\frac{n!}{(n-m)!}}{m!}=\frac{n!}{m!(n-m)!}$$
不理解可以手推一下。
2.互补性
$$C_n^m=C_n^{n-m}$$
口胡:对于每选出 $m$ 种元素的一种组合,都有剩余没选的 $n-m$ 个元素组成另一种组合。
3.组合数恒等式
$$C_{n+1}^m=C_n^m+C_n^{m-1}$$
通俗一点翻译过来为:在原先的 $n$ 个元素中多加入一个元素,根据分类加法计数原理,在原先的$C_n^m$下,显然少了含有新元素的情况。若要放进一个新元素,要拿出一个老元素供这个新元素放置, 即加上 $C_n^{m-1}$ 种方案。
求解
对于数据范围较小且在$long long$范围内,直接套公式求即可,但如果需重复计算,这将会浪费大量时间,可以先求出阶乘表,直接调用即可。
当然这里不是要说这个,这里要介绍的是递推求法。
基于组合数恒等式,令 $n=n+1$,那么式子就转化为了
$$C_n^m=C_{n-1}^m+C_{n-1}^{m-1}$$
结合数学上的规定:$C_0^i=C_1^1=1$ 和 $C_0^0=0$ 得出递推开始条件。
$$dp[0][0]=0$$
$$dp[0][i]=dp[1][1]=1,i \in [1,m]$$
递推式:
$$dp[i][j]=dp[i-1][j]+f[i-1][j-1]$$
有点类似于杨辉三角的递推式,有待继续学习。