📜  两个数的二项式系数的所有乘积之和,最高为K(1)

📅  最后修改于: 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)$

参考文献
  • 组合数学算法

  • 基础知识课