二项式反演:
f(n)=n∑i=0(−1)i(ni)g(i)⇔g(n)=n∑i=0(−1)i(ni)f(i)
这个式子可以通过集合相关知识得到(容斥)
然后令:h(n)=(−1)ng(n)
那么有
f(n)=n∑i=0(ni)h(i)⇔h(n)(−1)n=n∑i=0(ni)f(i)
然后把式子整理一下,得到第二种表示二项式定理的形式
f(n)=n∑i=0(ni)g(i)⇔g(n)=n∑i=0(ni)f(i)
直接带入推导并且交换枚举顺序可以得到:
f(n)=n∑j=0f(j)n∑i=j(−1)i−j(ni)(ij)
后面的组合数:(ni)(ij) 考虑其组合意义,从 n 个里面选 i 个再从 i 个里面选 j 个用组合阶乘式子能给推成(nj)(n−ji−j)
然后再改变枚举顺序,平移一下循环变量
f(n)=n∑j=0(nj)f(j)n−j∑t=0(−1)t(n−jt)
在后面乘上 1 的对应次方,用二项式定理转一步
f(n)=n∑i=0(ni)f(i)(1−1)n−j
显然得证(只有i=n时那个 (1−1)n−j 不为 0)
还有一种相对常见的式子,因为题目中大多会表述为恰好选几个,然后我们用多步容斥(或二项式反演)就会方便求解
f(n)=m∑i=n(in)g(i)⇔g(n)=m∑i=n(−1)i−n(in)f(i)
相关证明和上面的类似
例题
已经没有什么好害怕的了
我们设 g 为正确答案,f 为至少 k 个答案
设 dpi,j 为前 i 个选 j 个 A 中比 B 中大的
先看是不是要配对,不要那就是 fi,j+=fi−1,j
再看如果配对的话,那就是 fi,j=fi−1,j−1+(larger(i)−j+1)
larger(i) 表示 Ai 大于几个 Bi,可以用暴力或者单调栈做掉……
fx=dpn,x×(n−x)!
这里上个反演就做完了
gi=n∑i=k(−1)i−k(ik)×dpn,i×(n−i)!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律