计算两个值的排列数,并限制运行

时间:2010-09-02 14:58:14

标签: algorithm math combinatorics

我正在考虑解决this other question about counting the number of values whose digits sum to a target的方法,并决定尝试范围为[0,n ^ base]的情况。所以基本上你可以得到N个独立的数字,这是一个更简单的问题。

N个自然数可以总和到目标T的方式的数量很容易计算。如果你认为把它放在T-stick中的N-1分频器,你会看到答案是(T + N-1)!/(T!(N-1)!)。

但是,我们的N个自然数被限制为[0,base],因此可能性会减少。我想为这个案例找到一个简单的公式。

我考虑的第一件事就是扣除了用“大棒”取代棒的“基数”的可能性。不幸的是,有些可能性被重复计算,因为它们有多个位置可以插入“大棒”。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用生成功能。

假设订单很重要,那么您正在寻找

x^T的系数
(1 + x + x^2 + ... + x^b)(1 + x + x^2 + .. + x^b) ... n times

 = (x^(b+1) - 1)^n/(x-1)^n

使用二项式定理(甚至适用于-n),您应该能够将答案写为二项式系数乘积的总和。

设b + 1 = B.

使用二项式定理我们有

(x^(b+1) - 1)^n = Sum_{r=0}^{n} (-1)^(n-r)* (n choose r) x^(Br)

1/(x-1)^n = Sum (n+s-1 choose s) x^s

所以我们需要的答案是:

Sum (-1)^(n-r) * (n choose r)*(n+s-1 choose s)

对于符合

条件的任何r和s
Br + s = T.