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)\) 了。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/18755593
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步