开头
我只知道容斥不知道二项式反演。
反演,顾名思义就是有两个函数 f,g,知道 f 用 g 表示后反过来 g 用 f 表示。
二项式,(a+b)n,别学了二项式反演忘了二项式定理:
n∑i=0(ni)aibn−i=(a+b)n
常见形式
(一)
式子
f(n)=n∑i=0(−1)i(ni)g(i)⇕g(n)=n∑i=0(−1)i(ni)f(i)
证明
n∑i=0(−1)i(ni)f(i)=n∑i=0(−1)i(ni)i∑j=0(−1)j(ij)g(j)=n∑j=0g(j)(nj)n∑i=j(−1)i−j(n−ji−j)=n∑j=0g(j)(nj)[n−j=0]=g(n)
(二)
式子
f(n)=N∑i=n(−1)i(in)g(i)⇕g(n)=N∑i=n(−1)i(in)f(i)
证明
N∑i=n(−1)i(in)f(i)=N∑i=n(−1)i(in)N∑j=i(−1)j(ji)g(j)=N∑j=ng(j)(−1)j−n(jn)j∑i=n(−1)i−n(j−ni−n)=N∑j=ng(j)(−1)j−n(jn)[j−n=0]=g(n)
证明的总结
由于两个式子都是对称的,所以都只证明了充分性。
证明都用到了
(ab)(bc)=(ac)(a−cb−c)
和
[n=0]=n∑i=0(ni)(−1)i
多元的情况
我们拿二元举例子:
f(n,m)=n∑i=0m∑j=0(−1)i+j(ni)(mj)g(i,j)⇕g(n,m)=n∑i=0m∑j=0(−1)i+j(ni)(mj)f(i,j)
其他应该同理。
例题
第二类斯特林数
我不会,长大后再学习。(
错排
g(x) 表示 n 个位置中至多有 x 个位置放错的方案数,而 f(x) 表示恰好。
g(n)=n!g(n)=n∑i=0(ni)f(i)
反演
f(n)=n∑i=0(−1)n−i(ni)g(i)=n∑i=0(−1)n−i(ni)i!=n∑i=0(−1)n−in!(n−i)!=n!n∑i=0(−1)n−i(n−i)!=n!n∑i=0(−1)ii!
错排通项由此诞生。
由于后面的和式是 e−1 的泰勒展开,所以我们得到:
任意一个排列,当 n→∞,该排列为错排的概率为 1e。
P.S.
错排递推式 fn=(n−1)(fn−1+fn−2)。
若 n 所在环为二元环,删掉二元环后是错排,(n−1)fn−2。
否则环长至少为三,将 n 前后接起来跳过 n 后是错排,(n−1)fn−1。
P4859 已经没有什么好害怕的了
给定 n≤2000 长度的序列 a1,…,an 和 b1,…,bn,2n 个元素两两不同,求排列 p1,…,pn 的个数使得(以下的 k 为原题的 n+k2):
n∑i=1[ai>bpi]=k
设 f(x) 表示恰好 x 组 [ai>bpi] 的 {p} 的方案数,显然答案为 f(k)。
而 g(x) 表示钦定 x 组…………的方案数。
钦定和至少的区别
钦定指固定某些位置满足条件,而至少只是单纯的计数。
举个例子,假设要计数值域 0,1 的 a1,a2,a3,a4 序列中 ai=1 个数不少于 2 个的方案数。
对于 {a}={0,1,1,1} 来说:
至少:贡献为 1,因为就一种状态。
钦定:贡献为 3,因为序列中 3 个 1,我们钦定任意 2 个为 1 都会产生贡献,所以贡献为 (32)=3。
显然
g(x)=n∑i=x(ix)f(i)
二项式反演
f(x)=n∑i=x(−1)i−x(ix)g(i)Ans=f(k)=n∑i=k(−1)i−k(ik)g(i)
问题转化为求 g(k),…,g(n)。
首先我们可以将 {a},{b} 升序排序,由于值互不相同,所以可求 c1,…,cn 使得 bci≤ai≤bci+1。
我们考虑 DP,dp(i,j) 表示 a 的前 i 个中有 j 个钦定匹配了比她小的 b 值,即有
dp(i,j)=dp(i−1,j)+dp(i−1,j−1)⋅(ci−(j−1))
然后 g(i)=dp(n,i)⋅(n−i)! 就做完了。
时间 O(n2)。
record
CF997C Sky Full of Stars
有一个 n×n 的正方形网格,用红绿蓝三种颜色染色,求有多少种染色方案使得至少一行或一列是同一种颜色。
结果对 998244353 取模。
设 f(i,j) 表示恰好 i 行与 j 列颜色相同,而 g(i,j) 表示钦定 i 行与 j 列颜色相同。
g(x,y)=n∑i=xn∑j=y(ix)(jy)f(i,j)
二项式反演
f(x,y)=n∑i=xn∑j=y(−1)i+j−x−y(ix)(jy)g(i,j)Ans=3n2−f(0,0)=3n2−n∑i=0n∑j=0(−1)i+jg(i,j)
求 g(i,j) 要分类:
- i≠0,j≠0,此时钦定的同色行列颜色必然全部一样,即
g(i,j)=(ni)(nj)3(n−i)(n−j)+1
- i≠0,j=0(i=0,j≠0 情况类似),此时这些行之间颜色可以不同,即
g(i,0)=(ni)3n(n−i)+i
- i=j=0,此时自由了
我向往自由!
g(0,0)=3n2
综上
Ans=−2n∑i=1(−1)ig(i,0)−n∑i=1n∑j=1(−1)i+jg(i,j)=−2A−BA=n∑i=1(−1)i(ni)3n(n−i)+iB=n∑i=1n∑j=1(−1)i+j(ni)(nj)3(n−i)(n−j)+1
A,B 分开求(分别均使用二项式定理)
A=3n2n∑i=1(−1)i(ni)3−ni+i=3n2n∑i=1(ni)(−31−n)i=3n2((1−31−n)n−1)
B=3n2+1n∑i=1n∑j=1(−1)i+j(ni)(nj)3−ni−nj+ij=3n2+1n∑i=1(−1)i(ni)3−nin∑j=1(−1)j(nj)3(i−n)j=3n2+1n∑i=1(−1)i(ni)3−nin∑j=1(nj)(−3i−n)j=3n2+1n∑i=1(−1)i(ni)3−ni((1−3i−n)n−1)
所以就 O(nlogn) 解决了。
record
P6076 [JSOI2015]染色问题
n×m 的矩形棋盘,初始无色。现在有 C 种颜料涂,要求:
-
棋盘的每一行/列至少有一个小方格被染色。
-
每种颜色都在棋盘上出现至少一次。
求染色方案数 mod109+7。
一样的套路,我们发现设 f(i,j,k) 表示恰好 i,j 行/列至少有一个染色,k 种颜色被上在墙上的方案数比较困难。
正难则反,设 f(i,j,k) 表示恰好 i,j 行/列完全没有染色,k 种颜色没有上在墙上。
同理 g(i,j,k) 将 f 的恰好换成钦定。
有
g(i,j,k)=(ni)(mj)(Ck)(C−k+1)(n−i)(m−j)
然后求 g 关于 f 的表达式
g(i,j,k)=n∑x=im∑y=jC∑z=k(xi)(yj)(zk)f(x,y,z)
然后三元二项式反演
f(i,j,k)=n∑x=im∑y=jC∑z=k(−1)x+y+z−i−j−k(xi)(yj)(zk)g(x,y,z)
然而我们要求的最终答案是 f(0,0,0) 即(将 g 一开始的柿子带入)
f(0,0,0)=n∑i=0m∑j=0C∑k=0(−1)i+j+kg(i,j,k)=n∑i=0m∑j=0C∑k=0(−1)i+j+k(ni)(mj)(Ck)(C−k+1)(n−i)(m−j)=C∑k=0n∑i=0m∑j=0(−1)i+j+k(ni)(mj)(Ck)(C−k+1)(n−i)(m−j)
这样我们在第一层循环时预处理后面的幂,时间复杂度 O(nmC)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下