二项式反演

二项式反演

常见形式:

fn=i=0n(1)i(ni)gign=i=0n(1)i(ni)fi(0)fn=i=0n(ni)gign=i=0n(1)ni(ni)fi(1)fn=in(in)gign=in(1)in(in)fi(2)

本质:把 f,g 数组看成两个向量,中间的转移系数看成矩阵,那么左右两边式子的系数的矩阵互为逆矩阵。

二项式反演也可以看作是一种特殊的容斥,作用往往在于将 恰好 转化为 钦定

P6478 [NOI Online #2 提高组] 游戏

二项式反演经典入门例题

注意到要计数的是恰好 k 次平局的方案数,设 fi 表示恰好 i 次非平局的方案数,gi 表示钦定了 i 次非平局的方案数。

fk=i=km(1)ik(ik)gigk=i=km(ik)fi

现在要求的是树上钦定了 k 对祖孙关系的方案数,考虑设 hx,i 表示 x 的子树内钦定了 i 对祖孙关系的方案数。合并两个子树就类似卷积形式暴力合并,以及对新加的根节点看是否会新增一对祖孙关系即可。剩下 mk 对点可以随意匹配(只钦定了 k 对非平局,剩下的随便选),那么有:

gk=f1,k(mk)!

最后再套二项式反演即可。

弱化版:

P4859 已经没有什么好害怕的了

P5400 [CTS2019] 随机立方体

概率转计数,依旧将恰好转化为钦定,设 fk 表示恰好 k 个极大数的方案数,gk 表示钦定 k 个的方案数,那么有反演 1 形式。设 S(x)=(nx)(mx)(lx)

注意到 k 个极大数都会影响到 kkk 个纵截面,那么剩下的位置可以随便填。

再拆式子:

gi=nml(ni)!(mi)!(li)!×nml(nmlS(i))!×hi

第一部分表示选出 i 个位置作为极大值的坐标的方案数,第二部分表示其他无关位置随便标号的方案数,那么我剩下没有考虑到的是被极大影响的位置(包括自身)的值标号的方案数。

不妨从按极大坐标的值从大到小考虑,那么被影响的点的限制会越来越紧,方便计算。

设当前考虑到了第 j 个极大坐标,显然它是所有未填取数中的最大值,只能选取最大的那个值,那剩下哪些只跟当前最大值有关联的坐标(即当前只需小于第 j 个极大坐标),配合上当前还没填的个数的总数,可以得到将这些坐标填值的方案数。

具体而言,假设当前还剩下 w 个数未填(极大坐标不算入),当前只跟最大值有关联的坐标有 x 个,那么方案数为:wx_

需要填的个数是 S(j1)S(j)1(不被前 j1 个极大坐标影响的位置减去不被前 j 大极大坐标影响的位置再减去第 j 个极大坐标),还剩的总点数是 S(0)S(j1)1

那么有:

hi=j=1i(S(0)S(j1)1)!(S(0)S(j1)1(S(j1)S(j)1))!=(S(0)S(i)1)!j=1i11S(0)S(j)gi=nml(ni)!(mi)!(li)!×nml(S(0)S(i))!×(S(0)S(i)1)!j=1i11S(0)S(j)gi=nml(ni)!(mi)!(li)!(nml)!j=1i1S(0)S(j)ans=fk(nml)!=1(nml)!ik(1)ik(ik)nml(ni)!(mi)!(li)!(nml)!j=1i1S(0)S(j)ans=ik(1)ik(ik)nml(ni)!(mi)!(li)!j=1i1S(0)S(j)

注意到最多只有 min(n,m,l) 个极大值位置,所有直接求出每一项即可。

但是本题范围较大,不支持每次 O(logn) 求逆元。

trick:考虑类似与求阶乘逆元那样预处理出所有数相乘的逆元,再倒着往回推就可以得到每个数的逆元了,复杂度就降到了线性。

P4831 Scarlet loves WenHuaKe

牛牛题,介绍一个不需要多项式的做法。

首先显然每行恰好只有两个棋子。

转换:有编号为 1m 的球各两个,求所有多少种方案放入 n 对无序二元组且二元组内两数不同。设方案数为 f(n,m)

先忽略一些棘手的限制,设 g(n,m) 表示将这 2×m 个球放到 2×n 个格子中的方案数。

如何计算 g ?考虑先枚举二元组内的两数相同的数量,再用不同的数补空。

g(n,m)=(2n)!i=0min(mn,n)(mni)(mn+i2i)2ni

大概意思是 (mni) 的意思是枚举相同对数 ni 的方案数,(mn+12i) 表示从剩下的 mn+i 个颜色球中选 2i 个数。(2n)! 因为是有标号计数,再除掉相同数字的交换次序 2ni

再思考如何用 f 表示 g,注意到 g 其实是计数 n 对有序二元组的数量。

那么考虑枚举选了多少对二元组用了相同的数组,再选一些颜色的球放进去,剩下的就再将有序变成无序,即可得到:

g(n,m)=i=0n(ni)m!(mi)!2nif(ni,mi)

长得很像二项式反演!但是多了些杂项。

g(n,m)m!=i=0n(ni)2nif(ni,mi)(mi)!

注意到整个式子中,使用到的 f,g 中的 n,m 的差值始终不变,考虑换元。

Gi=g(i,in+m)(in+m)!Fi=2if(i,in+m)(in+m)!Gn=i=0n(ni)FniGn=i=0n(ni)FiFn=i=0n(1)ni(ni)GiFn=i=0n(1)i(ni)Gni2nf(n,m)m!=i=0n(1)i(ni)g(ni,mi)(mi)!f(n,m)=m!2ni=0n(1)i(ni)g(ni,mi)(mi)!

注意到算 g(n,m) 的复杂度是 O(min(mn,n)) 的,一共计算 n 次,复杂度为 O(min(mn,n)n),刚好满足题目数据。

P5401 [CTS2019] 珍珠

Nit 钦定的题目,确实比较牛。

设颜色为 k 的个数为 ck,方案合法要满足:

k=1Dck2mk=1Dckck mod 22mk=1Dck mod 2n2m

Dn2mn2m0 的情况是简单的,答案分别是 Dn0

fi 表示恰好有 ick 为奇数的方案数,依旧将恰好转钦定,设 gi 表示钦定了 ick 为奇数的方案数。

ans=i=0n2mfifi=ji(ji)(1)jigj

如果计算出 g 那么可以卷积得到 ans,那么现在可以转化为算 g

考注意到所有出现次数为奇数的排列方案数 xEGFexex2,出现次数任意的排列方案数的 EGFex

gk=[xnn!](Dk)(exex2)k(ex)Dk=[xnn!](Dk)12k(ex)Dkj=0k(1)j(kj)(ex)k2j=12kD!k!(Dk)![xnn!]j=0k(1)jk!j!(kj)!e(D2j)x

又有 EGF 公式:

i0cixii!=ecx

那么有:

gk=12kD!k!(Dk)!j=0k(1)jk!j!(kj)!(D2j)n=D!(Dk)!2kj=0i(1)j(D2j)nj!1(ij)!

注意到式子仍然是一个卷积形式,卷起来即可!

posted @   Hanghang007  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示