组合数C(n,m)的求法总结,卢卡斯定理

来源:互联网 发布:网络征信查询黑名单 编辑:程序博客网 时间:2024/05/01 05:33
组合数C(n,k)的求法总结
与组合数有关的两个最重要内容是杨辉三角和二项式定理。
杨辉三角前10行如下所示:

另一方面,将(a+b)^n展开,系数正好和杨辉三角一致。
一般有(a+b)^n=C(n,0)a^n+C(n,1)a^(n-1)b+...+C(n,n)b^n。
给定n,如何求出(a+b)^n所有项的系数呢?
方法一,递推,利用杨辉三角的性质,当前数等于上方两个数的和,表现在组合数上就是C(n,m)=C(n,m-1)+C(n-1,m-1)。
代码如下:
memset(C,0,sizeof(C));for (int i = 0; i <= n; ++i) {        C[i][0] = 1;        for (int j = 1; j <= i; ++j) {                C[i][j] = C[i][j - 1] + C[i - 1][j - 1];        }}
但是复杂度是n^2。
方法二,利用等式C(n,k)=(n-k+1)/k*C(n,k-1)。从C(n,0)=1开始递推。
代码:
C[0] = 1;for (int i = 1; i <= n; ++i) {        C[i] = (n-i+1)*C[i-1]/i;}
注意应该先除后乘,因为C[i-1]/i可能不是整数。但可能溢出。
上边等式的意义不是很明显,但很容易用组合数公式C(n,k)=n!/(k!(n-k)!)证明。
方法三,卢卡斯定理
待写

参考:http://baike.baidu.com/view/7804.htm
0 0
原创粉丝点击