「学习笔记」二项式反演

二项式反演:

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

这个式子可以通过集合相关知识得到(容斥)

然后令:h(n)=(1)ng(n)

那么有

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

然后把式子整理一下,得到第二种表示二项式定理的形式

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

直接带入推导并且交换枚举顺序可以得到:

f(n)=j=0nf(j)i=jn(1)ij(ni)(ij)

后面的组合数:(ni)(ij) 考虑其组合意义,从 n 个里面选 i 个再从 i 个里面选 j 个用组合阶乘式子能给推成(nj)(njij)

然后再改变枚举顺序,平移一下循环变量

f(n)=j=0n(nj)f(j)t=0nj(1)t(njt)

在后面乘上 1 的对应次方,用二项式定理转一步

f(n)=i=0n(ni)f(i)(11)nj

显然得证(只有i=n时那个 (11)nj 不为 0


还有一种相对常见的式子,因为题目中大多会表述为恰好选几个,然后我们用多步容斥(或二项式反演)就会方便求解

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

相关证明和上面的类似

例题

已经没有什么好害怕的了

我们设 g 为正确答案,f 为至少 k 个答案

dpi,j 为前 i 个选 jA 中比 B 中大的

先看是不是要配对,不要那就是 fi,j+=fi1,j

再看如果配对的话,那就是 fi,j=fi1,j1+(larger(i)j+1)

larger(i) 表示 Ai 大于几个 Bi,可以用暴力或者单调栈做掉……

fx=dpn,x×(nx)!

这里上个反演就做完了

gi=i=kn(1)ik(ik)×dpn,i×(ni)!

posted @   没学完四大礼包不改名  阅读(162)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示