组合数C(n, k)的求法:
1. 浮点数迭代法
缺点: 当数比较大的时候, 可能结构不够精确.
使用公式
或:
2. 动态规划法
缺点: 对空间有较大的要求.
具体为:
n | ||||||||
0 | 1 | |||||||
1 | 1 | 1 | ||||||
2 | 1 | 2 | 1 | |||||
3 | 1 | 3 | 3 | 1 | ||||
4 | 1 | 4 | 6 | 4 | 1 | |||
5 | 1 | 5 | 10 | 10 | 5 | 1 | ||
6 | 1 | 6 | 15 | 20 | 15 | 6 | 1 | |
7 | 1 | 7 | 21 | 35 | 35 | 21 | 7 | 1 |
.快速算法
还有一种快速算法, 在<<C语言名题精选百则>>上有所叙述.
下面展示一道题:
pku 3219 Binomial Coefficients
求C(n, k)的最后一位是0,还是1(即结果是奇数还是偶数).
这道题采用一步一步的优化的演示方法.
可以注意到k<=n<2^31, k,n如此之大, 肯定不能用上面的方法, 也不必用, 因为他只需要知道结构是奇数还是偶数.
那判断C(n,k) = A(n,k)/A(k,k)的分母分子个含有2这个因子的个数的多少,相减即可.