前置知识:
1.排列组合
2.多步容斥
(记一下可能会用到的公式平时也很常用的
(nm)×(ms)=(ns)×(n−sn−m)(mm−1)+(mm)=(m+1m)
前置知识
二项式定理:
公式
(a+b)n=n∑i=0(ni)aibn−i
证明:
n=1 时代入显然成立
设 n=m 时该式子成立在证明 n=m+1 时该式子成立就可以推得该式子成立。
n=m 代入得到
(a+b)m=m∑i=0(mi)aibm−i
那么就有了(以下所有注释都是对上一行的解释)
(a+b)m+1=(a+b)(a+b)m=a(a+b)m+b(a+b)m=am∑i=0(mi)aibm−i+bm∑j=0(mj)aibm−j=m∑i=0(mi)ai+1bm−i+m∑j=0(mj)ajbm−j+1=am+1+m−1∑i=0(mi)ai+1bm−i+bm+1+m∑j=1(mj)ajbm−j+1
//i=m,(mm)am+1b0=am+1,j=0,(m0)a0bm+1=bm+1
=am+1+m∑j=1(mj−1)ajbm−j+1+bm+1+m∑j=1(mj)ajbm−j+1
//用 j表示 i
=am+1+m∑j=1[ (mj−1)+(mj) ]ajbm−j+1+bm+1=am+1+m∑j=1[ (m+1j) ]ajbm−j+1+bm+1
//证明 (mj−1)+(mj)=(m+1j)
//(mj−1)+(mj)=m!(j−1)!(m−j+1)!+m!j!(m−j)!
//=(m−j+1)m!+m!j(j)!(m−j+1)!
//=(m+1)m!(j)!(m−j+1)!
//=(m+1j)
=m+1∑j=0[ (m+1j) ]ajbm−j+1
//
当j=0,(m+10)a0bm+1=bm+1,j=m+1,(m+1m+1)am+1b0=am+1
显然证明得到二项式定理成立
然后我们再来推二项式反演:
二项式反演
基本形式(形式0):
公式
fn=n∑i=0(−1)i(ni)gi⇕gn=n∑i=0(−1)i(ni)fi
证明形式0:
前置知识:多步容斥
多步容斥一般形式:
|A1∪A2∪A3∪…∪An|=n∑i=1|Ai|−n∑i=1,j=1|Ai∩Aj|+…+(−1)n−1×|A1∩A2∩…∩An|
我们设Aci表示Ai的补集,将多步容斥一般形式变形,可得:
|Aci∩Ac2∩…∩Acn|=|S|−n∑i=1|Ai|+n∑i=1,j=1|Ai∩Aj|−…+(−1)n=times|A1∩A2∩…∩An|
由于补集的补集就是原集,所以又有了
|Ai∩A2∩…∩An|=|S|−n∑i=1|Aci|+n∑i=1,j=1|Aci∩Acj|−…+(−1)n×|Ac1∩Ac2∩…∩Acn|
那么我们fn表示n个补集的交际大小,gn表示n个原集的大小,两个公式分别可以写成:
fn=n∑i=0(−1)i(ni)gign=n∑i=0(−1)i(ni)fi
两公式是相互推导的关系,所以这就是二项式反演的形式0
常见形式(形式1):
公式
fn=n∑i=0(ni)gi⇕gn=n∑i=0(−1)n−i(ni)fi
当然它还有一个更常用的变形:
fk=n∑i=k(ik)gi⇕gk=n∑i=k(−1)i−k(ik)fi
证明形式1:
已知
fn=n∑i=0(ni)gi
我们使gi是gj,n就是i
那么
n∑i=0(−1)n−i(ni)fi=n∑i=0(−1)n−i(ni)i∑j=0(ij)gj=n∑i=0i∑j=0(−1)n−i(ni)(ij)gj=n∑i=0i∑j=0(−1)n−i(nj)(n−ji−j)gj
//(nm)×(ms)=(ns)×(n−sn−m)
//再将 n 和 i 该替换的替换
=n∑j=0n∑i=j(−1)n−i(nj)(n−ji−j)gj
//我们把j放在前面
//对于两个大 sigma ∑ni=0∑ij=0 来说,他代表 i∈[0,n],i>=j 的情况。
//其实和 j∈[0,n],i>=j 的所有情况。
//呃呃其实到这里的时候我也是有点懵,建议在这里琢磨琢磨。
//其实 i 和 j的范围都没变对吧。
对于 j=n 时 n∑i=j(−1)n−i(nj)(n−ji−j)gj 的值是 gn
对于 j!=n 时,考虑 gj 的系数。
我们先固定一个 j,那么 (nj) 作为一个常数,删去
n∑i=j(−1)n−i(n−ji−j)
然后 n−j 也是常数,设 m=n−j,
并将 i 向左平移,使得范围 ∈[j,n]变为∈[0,m] ,或者理解成 i 代表 i−j,
那么系数就是:
m∑i=0(−1)m−i(mi)
刚刚我们推导的二项式定理:
(a+b)n=n∑i=0(ni)aibn−i
我们让 a=1,b=−1,n=m,
就有了:
0=m∑i=0(mi)(−1)m−i
gj 的系数就等于 0 啊!
那么仅 j=n 时 gj 系数和为 1
那么对于:
n∑i=0(−1)n−i(ni)fi=n∑i=0(−1)n−i(ni)i∑j=0(ij)gj
右边系数为 1,
有了:
n∑i=0(−1)n−i(ni)fj=gn
证毕。
(所以我们还是容斥+感性理解吧?)
应用:恰好与最多,恰好与至少之间的转换。
例题:
BZOJ 4403 集合计数
对于这道题,我们通过二项式反演公式:
fk=n∑i=k(ik)gi⇕gk=n∑i=k(−1)i−k(ik)fi
显然有
fi=n∑j=1(−1)j−i(ji)fj
嗯。
如果有错误请直接指出。
累了,听说这个还能用容斥写。
所有 LATEX 公式纯手打。
炸了体谅一下orz
upd:2023/9/22 21:43 修复部分 LATEX 问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步