2025.2.21 闲话:递推求组合数前缀和

遇到一道题,其中有一个部分是对于 \(i \in [0,n]\),求:

\[f(i) = \sum_{j=0}^{n} \tbinom{i}{j} \]

要求时间复杂度 \(O(n)\)


首先有一个公式:\(\tbinom{n}{m}+\tbinom{n}{m-1}=\tbinom{n+1}{m}\)

然后我们把 \(\sum_{j=0}^{n} \tbinom{i}{j}\) 拆开,复制一份并上下对齐:

\[\begin{aligned} &\tbinom{i}{0}&+&\tbinom{i}{1}&+&\tbinom{i}{2}&+&\cdots&+&\tbinom{i}{n} \\ +\qquad &&&\tbinom{i}{0}&+&\tbinom{i}{1}&+&\cdots&+&\tbinom{i}{n-1}&+&\tbinom{i}{n}\\ \hline &\tbinom{i}{0}&+&\tbinom{i+1}{1}&+&\tbinom{i+1}{2}&+&\cdots&+&\tbinom{i+1}{n}&+&\tbinom{i}{n} \end{aligned} \]

即:\(2 \times \sum_{j=0}^{n} \tbinom{i}{j} = \tbinom{i}{0} + \sum_{j=1}^{n} \tbinom{i}{j} + \tbinom{i}{n}\)

因为 \(\tbinom{i}{0}=\tbinom{i+1}{0}=1\),所以右式等于 \(\sum_{j=0}^{n} \tbinom{i}{j} + \tbinom{i}{n} = f(i+1) - \tbinom{i+1}{n} + \tbinom{i}{n}\)

即:

\[f(i+1) = f(i) \times 2 - \tbinom{i}{n} + \tbinom{i+1}{n} \]

初始化 \(f(0)=1\),这样就可以 \(O(n)\) 递推 \(f(0 \sim n)\) 了。

posted @ 2025-03-06 15:58  Jerrycyx  阅读(28)  评论(0)    收藏  举报