二项式反演口胡

由于 wtcl ,所以讲得很基础

反演是什么

假设我们已经知道了 g(n)=i=0nanif(j) 中的 a 这个系数数组

我们想要推求的是某一个 b 数组,满足 f(n)=i=0nbnig(i)

我们考虑 a,b 两个数组有什么关系,假装我们现在已经的确找到了这样一个 b

那么:

(1)f(n)=i=0nbnij=0iaijf(j)(2)=i=0nf(i)j=inbnjaji

所以我们只要求 j=inbnjaji=[i=n] 即可,这里可以把 n,i 看成是一个常量

也就是说,只要我们找到了这种 b ,就完成了我们的二项式反演,可以从更直观的角度理解上面那个式子的变化

(上图是白嫖的老师课件里老师白嫖的不知道哪位大佬的图)

二项式反演

基础式

g(n)=i=0n(1)i(ni)f(i)f(n)=i=0n(1)i(ni)g(i)

我们现在的任务是证明 i=jn(1)i+j(ni)(ij)=[j=n]

首先得知道这个东西:

(ni)(ij)=(nj)(njij)

一种方式是直接按照组合数定义展开证明,

另一种是组合数的意义:左式是 niij ,那我不妨直接 nj ,然后从剩下的 nj 个数中不足没有选的 ij

那么:

(3)i=jn(1)i+j(ni)(ij)(4)=i=jn(1)i+j(nj)(njij)(5)=(1)j(nj)i=jn(1)i(njij)(6)=(1)j(nj)i=0nj(1)i+j(nji)(7)=(1)2j(nj)i=0nj(1)i(nji)

这个时候我们直接二项式定理,(x+y)ni=0n(ni)xiyni 那么

(1)2j(nj)i=0nj(1)i(nji)=(1)2j(nj) 0nj

再这里我们令 00=1 ,那么原式显然当且仅当 j=n 时为 1

由于很难找到这种含 (1)i 的容斥系数,所以这个基本式作用不大

变式1

g(n)=i=0n(ni)f(i)f(n)=i=0n(1)ni(ni)g(i)

很容易证明它,我们的基本式叫做:g(n)=i=0n(1)i(ni)f(i)f(n)=i=0n(1)i(ni)g(i)

那么,我们令 h(x)=(1)xf(x) ,那么,利用基本式,

g(n)=i=0n(ni)h(x)h(n)(1)n=i=0(1)i(ni)g(i)f(n)=i=0n(1)ni(ni)g(i)

这里给出一个小应用:

题意:错排问题 ,有多少种排列方式,使得 pi𝑖

解题:虽然我们可以直接套错排公式,这里还是介绍一下二项式反演怎么做

定义 𝑓(i) 表示恰好有 𝑖 个错开,𝑔(i) 表示至多有 𝑖 个元素错开

那么有: 𝑔(i)=𝑖! , 𝑔(i)=j=0(1)ij(ij)f(j)

反演一下:f(n)=i=0n(1)ni(ni)g(i)

变式2

g(n)=i=nm(in)f(i)f(n)=i=nm(1)in(in)g(i)

证明略去

posted @   _Famiglistimo  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示