二项式反演
常见形式:
fn=n∑i=0(−1)i(ni)gi⇔gn=n∑i=0(−1)i(ni)fi(0)fn=n∑i=0(ni)gi⇔gn=n∑i=0(−1)n−i(ni)fi(1)fn=∑i≥n(in)gi⇔gn=∑i≥n(−1)i−n(in)fi(2)
本质:把 f,g 数组看成两个向量,中间的转移系数看成矩阵,那么左右两边式子的系数的矩阵互为逆矩阵。
二项式反演也可以看作是一种特殊的容斥,作用往往在于将 恰好 转化为 钦定
二项式反演经典入门例题
注意到要计数的是恰好 k 次平局的方案数,设 fi 表示恰好 i 次非平局的方案数,gi 表示钦定了 i 次非平局的方案数。
fk=m∑i=k(−1)i−k(ik)gi⇔gk=m∑i=k(ik)fi
现在要求的是树上钦定了 k 对祖孙关系的方案数,考虑设 hx,i 表示 x 的子树内钦定了 i 对祖孙关系的方案数。合并两个子树就类似卷积形式暴力合并,以及对新加的根节点看是否会新增一对祖孙关系即可。剩下 m−k 对点可以随意匹配(只钦定了 k 对非平局,剩下的随便选),那么有:
gk=f1,k(m−k)!
最后再套二项式反演即可。
弱化版:
概率转计数,依旧将恰好转化为钦定,设 fk 表示恰好 k 个极大数的方案数,gk 表示钦定 k 个的方案数,那么有反演 1 形式。设 S(x)=(n−x)(m−x)(l−x)
注意到 k 个极大数都会影响到 k 行 k 列 k 个纵截面,那么剩下的位置可以随便填。
再拆式子:
gi=nml(n−i)!(m−i)!(l−i)!×nml(nml−S(i))!×hi
第一部分表示选出 i 个位置作为极大值的坐标的方案数,第二部分表示其他无关位置随便标号的方案数,那么我剩下没有考虑到的是被极大影响的位置(包括自身)的值标号的方案数。
不妨从按极大坐标的值从大到小考虑,那么被影响的点的限制会越来越紧,方便计算。
设当前考虑到了第 j 个极大坐标,显然它是所有未填取数中的最大值,只能选取最大的那个值,那剩下哪些只跟当前最大值有关联的坐标(即当前只需小于第 j 个极大坐标),配合上当前还没填的个数的总数,可以得到将这些坐标填值的方案数。
具体而言,假设当前还剩下 w 个数未填(极大坐标不算入),当前只跟最大值有关联的坐标有 x 个,那么方案数为:wx––。
需要填的个数是 S(j−1)−S(j)−1(不被前 j−1 个极大坐标影响的位置减去不被前 j 大极大坐标影响的位置再减去第 j 个极大坐标),还剩的总点数是 S(0)−S(j−1)−1。
那么有:
hi=i∏j=1(S(0)−S(j−1)−1)!(S(0)−S(j−1)−1−(S(j−1)−S(j)−1))!=(S(0)−S(i)−1)!i−1∏j=11S(0)−S(j)gi=nml(n−i)!(m−i)!(l−i)!×nml(S(0)−S(i))!×(S(0)−S(i)−1)!i−1∏j=11S(0)−S(j)gi=nml(n−i)!(m−i)!(l−i)!(nml)!i∏j=11S(0)−S(j)ans=fk(nml)!=1(nml)!∑i≥k(−1)i−k(ik)nml(n−i)!(m−i)!(l−i)!(nml)!i∏j=11S(0)−S(j)ans=∑i≥k(−1)i−k(ik)nml(n−i)!(m−i)!(l−i)!i∏j=11S(0)−S(j)
注意到最多只有 min(n,m,l) 个极大值位置,所有直接求出每一项即可。
但是本题范围较大,不支持每次 O(logn) 求逆元。
小 trick:考虑类似与求阶乘逆元那样预处理出所有数相乘的逆元,再倒着往回推就可以得到每个数的逆元了,复杂度就降到了线性。
牛牛题,介绍一个不需要多项式的做法。
首先显然每行恰好只有两个棋子。
转换:有编号为 1∼m 的球各两个,求所有多少种方案放入 n 对无序二元组且二元组内两数不同。设方案数为 f(n,m)
先忽略一些棘手的限制,设 g(n,m) 表示将这 2×m 个球放到 2×n 个格子中的方案数。
如何计算 g ?考虑先枚举二元组内的两数相同的数量,再用不同的数补空。
g(n,m)=(2n)!min(m−n,n)∑i=0(mn−i)(m−n+i2i)2n−i
大概意思是 (mn−i) 的意思是枚举相同对数 n−i 的方案数,(m−n+12i) 表示从剩下的 m−n+i 个颜色球中选 2i 个数。(2n)! 因为是有标号计数,再除掉相同数字的交换次序 2n−i。
再思考如何用 f 表示 g,注意到 g 其实是计数 n 对有序二元组的数量。
那么考虑枚举选了多少对二元组用了相同的数组,再选一些颜色的球放进去,剩下的就再将有序变成无序,即可得到:
g(n,m)=n∑i=0(ni)m!(m−i)!2n−if(n−i,m−i)
长得很像二项式反演!但是多了些杂项。
g(n,m)m!=n∑i=0(ni)2n−if(n−i,m−i)(m−i)!
注意到整个式子中,使用到的 f,g 中的 n,m 的差值始终不变,考虑换元。
Gi=g(i,i−n+m)(i−n+m)!Fi=2if(i,i−n+m)(i−n+m)!Gn=n∑i=0(ni)Fn−iGn=n∑i=0(ni)Fi⇔Fn=n∑i=0(−1)n−i(ni)GiFn=n∑i=0(−1)i(ni)Gn−i2nf(n,m)m!=n∑i=0(−1)i(ni)g(n−i,m−i)(m−i)!f(n,m)=m!2nn∑i=0(−1)i(ni)g(n−i,m−i)(m−i)!
注意到算 g(n,m) 的复杂度是 O(min(m−n,n)) 的,一共计算 n 次,复杂度为 O(min(m−n,n)n),刚好满足题目数据。
Nit 钦定的题目,确实比较牛。
设颜色为 k 的个数为 ck,方案合法要满足:
D∑k=1⌊ck2⌋≥mD∑k=1ck−ck mod 2≥2mD∑k=1ck mod 2≤n−2m
D≤n−2m 和 n−2m≤0 的情况是简单的,答案分别是 Dn 和 0。
设 fi 表示恰好有 i 个 ck 为奇数的方案数,依旧将恰好转钦定,设 gi 表示钦定了 i 个 ck 为奇数的方案数。
ans=n−2m∑i=0fifi=∑j≥i(ji)(−1)j−igj
如果计算出 g 那么可以卷积得到 ans,那么现在可以转化为算 g。
考注意到所有出现次数为奇数的排列方案数 x 的 EGF 为 ex−e−x2,出现次数任意的排列方案数的 EGF 为 ex
gk=[xnn!](Dk)(ex−e−x2)k(ex)D−k=[xnn!](Dk)12k(ex)D−kk∑j=0(−1)j(kj)(ex)k−2j=12kD!k!(D−k)![xnn!]k∑j=0(−1)jk!j!(k−j)!e(D−2j)x
又有 EGF 公式:
∑i≥0cixii!=ecx
那么有:
gk=12kD!k!(D−k)!k∑j=0(−1)jk!j!(k−j)!(D−2j)n=D!(D−k)!2ki∑j=0(−1)j(D−2j)nj!1(i−j)!
注意到式子仍然是一个卷积形式,卷起来即可!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具