由于 wtcl ,所以讲得很基础
反演是什么
假设我们已经知道了 g(n)=∑ni=0anif(j) 中的 a 这个系数数组
我们想要推求的是某一个 b 数组,满足 f(n)=∑ni=0bnig(i)
我们考虑 a,b 两个数组有什么关系,假装我们现在已经的确找到了这样一个 b
那么:
f(n)=n∑i=0bnii∑j=0aijf(j)=n∑i=0f(i)n∑j=ibnjaji(1)(2)
所以我们只要求 ∑nj=ibnjaji=[i=n] 即可,这里可以把 n,i 看成是一个常量
也就是说,只要我们找到了这种 b ,就完成了我们的二项式反演,可以从更直观的角度理解上面那个式子的变化
(上图是白嫖的老师课件里老师白嫖的不知道哪位大佬的图)
二项式反演
基础式
g(n)=n∑i=0(−1)i(ni)f(i)⇔f(n)=n∑i=0(−1)i(ni)g(i)
我们现在的任务是证明 ∑ni=j(−1)i+j(ni)(ij)=[j=n]
首先得知道这个东西:
(ni)(ij)=(nj)(n−ji−j)
一种方式是直接按照组合数定义展开证明,
另一种是组合数的意义:左式是 n 选 i ,i 选 j ,那我不妨直接 n 选 j ,然后从剩下的 n−j 个数中不足没有选的 i−j 个
那么:
n∑i=j(−1)i+j(ni)(ij)=n∑i=j(−1)i+j(nj)(n−ji−j)=(−1)j(nj)n∑i=j(−1)i(n−ji−j)=(−1)j(nj)n−j∑i=0(−1)i+j(n−ji)=(−1)2j(nj)n−j∑i=0(−1)i(n−ji)(3)(4)(5)(6)(7)
这个时候我们直接二项式定理,(x+y)n∑ni=0(ni)xiyn−i 那么
(−1)2j(nj)n−j∑i=0(−1)i(n−ji)=(−1)2j(nj) 0n−j
再这里我们令 00=1 ,那么原式显然当且仅当 j=n 时为 1
由于很难找到这种含 (−1)i 的容斥系数,所以这个基本式作用不大
变式1
g(n)=n∑i=0(ni)f(i)⇔f(n)=n∑i=0(−1)n−i(ni)g(i)
很容易证明它,我们的基本式叫做:g(n)=∑ni=0(−1)i(ni)f(i)⇔f(n)=∑ni=0(−1)i(ni)g(i)
那么,我们令 h(x)=(−1)xf(x) ,那么,利用基本式,
g(n)=n∑i=0(ni)h(x)⇒h(n)(−1)n=∑i=0(−1)i(ni)g(i)⇒f(n)=n∑i=0(−1)n−i(ni)g(i)
这里给出一个小应用:
题意:错排问题 ,有多少种排列方式,使得 pi≠i
解题:虽然我们可以直接套错排公式,这里还是介绍一下二项式反演怎么做
定义 f(i) 表示恰好有 i 个错开,g(i) 表示至多有 i 个元素错开
那么有: g(i)=i! , g(i)=∑j=0(−1)i−j(ij)f(j)
反演一下:f(n)=∑ni=0(−1)n−i(ni)g(i)
变式2
g(n)=m∑i=n(in)f(i)⇔f(n)=m∑i=n(−1)i−n(in)g(i)
证明略去
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?