二项式反演的证明

摘自学长zsy的PPT。虽然没有原文链接,但为了表示对学长劳动成果的尊重,这里粘贴一个友情链接。zsy学长平时为人大方,上课生动有趣,并且对自己所讲的每个知识点都非常认真。推荐前往他的博客观摩学习。

我们都知道二项式的生成函数:

f(x)=(1+x)n=k=0n(nk)xk

当我们带入x=1时,会得到这样的式子:

f(1)=(11)n=k=0n(nk)(1)k

n=0时,左边的部分没有意义。但右边算出来恰好为(00)=1。因此我们得到了一个恒等式:

k=0n(nk)(1)k=[n=0]=ϵ(n+1)

假设我们知道f(n)=k=0n(nk)g(k),那么我们如何用f(k)来表示g(n)呢?

我们首先拼凑出一个二项式的形式:

g(n)=m=0n[n=m]g(m)=m=0nϵ(nm+1)g(m)

然后代入上面那个恒等式:

g(n)=m=0nk=0nm(1)k(nm)(nmk)g(m)

根据组合的意义,不难得到:

g(n)=m=0nk=0nm(1)k(nk)(nkm)g(m)

接下来需要交换求和号。为了方便理解,我这里令Smk=(1)k(nk)(nkm)g(m),那么原式就变成了m=0nk=0nmSmk

[S0,0S0,1S0,n1S0,nS1,0S1,1S1,n1Sn1,0Sn1,1Sn,0]

显然,之前的求法是一行一行,从左往右求和。我们同样以一列一列,从上往下求和。因此:

g(n)=k=0nm=0nk(1)k(nk)(nkm)g(m)

提出和m无关的系数:

g(n)=k=0n(1)k(nk)m=0nk(nkm)g(m)

注意到m=0nk(nkm)g(m)就是f(nk)。因此:

g(n)=k=0n(1)k(nk)f(nk)

把它改写成更加直观的形式:

g(n)=k=0n(1)nk(nk)f(k)

这就是二项式反演了。通过它,我们可以利用二项式求和推出不好计算的答案。

说到底,反演还是和容斥脱不了干系。

posted @   LinearODE  阅读(314)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
阅读排行:
· 博客园2025新款「AI繁忙」系列T恤上架
· Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)
· C# LINQ 快速入门实战指南,建议收藏学习!
· Redis实现高并发场景下的计数器设计
· 上周热点回顾(4.7-4.13)
点击右上角即可分享
微信分享提示