📅  最后修改于: 2023-12-03 15:35:56.657000             🧑  作者: Mango
给定两个非负整数 m 和 n,求它们的二项式系数的所有乘积之和,即:
$ \sum_{i = 0}^m \sum_{j = 0}^n \binom{m}{i} \binom{n}{j} $
其中 $ \binom{m}{i} $ 表示从 $m$ 个不同元素中选出 $i$ 个元素的方案数,即二项式系数。
输入:m = 2, n = 3
输出:35
解释:$ \binom{2}{0} \binom{3}{0} + \binom{2}{0} \binom{3}{1} + \binom{2}{0} \binom{3}{2} + \binom{2}{0} \binom{3}{3} + \binom{2}{1} \binom{3}{0} + \binom{2}{1} \binom{3}{1} + \binom{2}{1} \binom{3}{2} + \binom{2}{2} \binom{3}{0} + \binom{2}{2} \binom{3}{1} + \binom{2}{2} \binom{3}{2} = 35 $
对于二项式系数 $ \binom{m}{i} $ 和 $ \binom{n}{j} $,考虑到其为 $m$ 和 $n$ 的多项式展开式中的某一项,可以将其转换为两个二项式的乘积:
$ \binom{m}{i} \binom{n}{j} = \frac{m!}{i!(m-i)!} \cdot \frac{n!}{j!(n-j)!} = \frac{m!}{i!(m-i)!} \cdot \frac{n!}{(n-j)!(j)!} = (-1)^j \frac{n!}{j!(n-j)!} \cdot \frac{(-1)^i m!}{i!(m-i)!} = (-1)^j \binom{-m}{i} \binom{n}{j} $
因此,
$ \sum_{i=0}^m \sum_{j=0}^n \binom{m}{i} \binom{n}{j} = \sum_{i=0}^m \sum_{j=0}^n (-1)^j \binom{-m}{i} \binom{n}{j} = \sum_{j=0}^n (-1)^j \binom{n}{j} \sum_{i=0}^m \binom{-m}{i} = \sum_{j=0}^n (-1)^j \binom{n}{j} \binom{-m-1}{m} $
这里需要用到另一个性质:
$ \sum_{i=0}^m \binom{-m}{i}(-1)^i = \binom{-m-1}{m} $
综上,就可以用 $O(m+n)$ 的时间复杂度求解本题。
def binomials_product_sum(m: int, n: int, k: int) -> int:
# 求二项式系数的所有乘积之和
s = 0
for j in range(n + 1):
sgn = (-1) ** j
cnj = math.comb(n, j)
cmm = math.comb(-m - 1, m)
s += sgn * cnj * cmm
return s
时间复杂度:$O(m + n)$
空间复杂度:$O(1)$
组合数学算法
基础知识课