我不会组合计数
二项式系数
定义
定义组合数 (nm)(nm) 表示从 n 个不同物品中挑选 m 个数构成集合的方案。
定义排列数 Amn 表示从 n 个不同物品中选出 m 个数进行排列的方案,有 Amn=n×(n−1)⋯×(n−m+1) ,而 m 个物品对应了 m! 个排列, 因此 (nm)=n!m!(n−m)!。
根据组合数的定义,有 (nm)=(nn−m)。
-
重要公式
-
二项式定理:(1+x)n=n∑i=0(ni)xi
-
(n0)=1,(n1)=n,(n2)=n(n−1)2
-
(nm)=(n−1m)+(n−1m−1) ,考虑组合意义为 n 个数中选 m 个, 枚举最后一个数选不选。
-
n∑i=0(ni)=2n,n/2∑i=0(n2i)=n/2∑i=0(n2i+1)=2n−1, n∑i=0(−1)i(ni)=[n=0], 在容斥原理有用。
-
(nm)=(n−1m−1)×nm ,n∑i=0i×(ni)=n×2n−1
-
上指标求和:n∑i=0(im)=(n+1m+1) ,组合意义为枚举 n+1 中选 m+1 个数的最后一个。
-
对角线求和:n∑i=0(m+ii)=(m+n+1n)。 考虑按第三条性质数学归纳。
-
范德蒙德卷积:k∑i=0(ni)(mk−i)=(n+mk)。
考虑 [xk](1+x)n(1+x)m,另一形式:n∑i=0(ni)(mi+k)=(n+mk)
-
上指标范德蒙德卷积:n∑k=0(kl)(n−kr)=(n+1l+r+1)。
考虑 Fl(x)=∑n(nl)=xl(1−x)l+1 和 Fr(x)=∑n(nr)=xr(1−x)r+1, 相乘得到 xl+r(1−x)l+r+2。
-
将二项式系数的上指标 n 扩展到任意实数, 定义广义 / 牛顿二项式系数 (nm)=nm_m!, 其中 nm_=m∏i=1(n−i+1)。
-
广义二项式定理:(1+x)α=+∞∑m=0(αm)xm [x∈[−1,1]] ,可以计算负数的组合数,具体详见例题。
-
上指标翻转:(nm)=(−1)m(m−n−1m)
-
多项式系数:将 n 个不同物体划分成 m 个集合, 第 i 个集大小为 ai 的方案数称为多项式系数 (na1,a2,…,am)=(na1)×(n−a1a2)×⋯=n!a1!a2!…am! 。
与之对应的有多项式定理:(m∑i=1xi)n=∑m∑i=1ai=n(na1,a2,…,am)×m∏i=1xai
-
(不知道叫什么名字的)恒等式:m∑i=0(n+mi)xiym−i=m∑i=0(−ni)(−x)i(x+y)m−i。
带入 x=1,y=−1 可以得到:m∑i=0(n+mi)(−1)i=(−nm)
带入 x=y=1,n=m+1 得到:m∑i=0(2m+1i)=m∑i=0(m+ii)2m−i
而等式左边就是第 2m+1 行前一半的和,为 22m,因此还可以得到:m∑i=0(m+ii)2m−i=22m
-
(nm)(mk)=(nk)(n−km−k)
-
例题
例题1
求出所有长度为 n 的数列, 每个数都在 [1,m] 的范围内,每个·序列本质不同的子数列个数。
由于要求本质不同,我们只计算这个子序列第一次出现的次数。
设子序列位置为 a1,a2,…,am, 则此子序列为第一次出现的充要条件为 ∀i∈[1,m] ,在 ai−1+1 到 ai−1 中没有 ak=ai。
枚举子序列长度和最后一个数的位置,有:
二项式定理即可。
例题 2
计算 b∑i=ad∑j=c(i+ji)
例题 3:[CERC2015]Frightful Formula
给定 F(1,i) 和 F(i,1),其中 F 满足 F[i,j]=aF[i−1,j]+bF[i,j−1]+c, 求 F[n,n]。
考虑分别计算 F(1,i) 和 F(i,1) 对答案的贡献,赋予路径组合意义。
先不考虑 c, 设向下乘上 a, 向右乘上 b, 那么一条路径的权值就是所有 a,b 之积。
再单独考虑 c ,发现也是同理的,假设位置 (x,y) ,那么对答案贡献为 (2∗n−x−yn−x)an−xbn−yc。
答案就是:
前两项直接计算即可, 考虑最后的 n−2∑i=0n−2∑j=0(i+jj)aibj。
设 gi=n−2∑j=0(i+jj)bj ,显然 g 可以递推,直接计算即可。
例题 4 [ARC061D] 3人でカードゲーム / Card Game for Three
考虑构造一个抽牌序列与一个操作序列的双射:序列 ai 表示第 i 次抽牌抽到的数字,那么若最先出现 n 个 1 A 就胜利了。
分别枚举 2,3 出现的次数,有:
设 gn=∑n−k≤i≤m(ni),则有 gn+1=2×gn+(nn−k−1)−(nm)。
例题 5
给定一棵 n 个节点的外向树,求其拓扑排序的方案。
考虑 dp,设 dpx 表示 x 子树中以 x 为根的拓扑排序方案,则 dpx=(sizx−1)!∏y∈sonx(sizy!)∏y∈sonxdpy
例题 6【2018雅礼day1-3】图
考虑设 gi 表示 i 结尾的黑色 / 白色交错路个数,直接将 gi 的奇偶性放进 dp 里面。
设 dpi,j,k 表示考虑到前 i 个点,其中 j 个白色的 g 为奇数,k 个黑色的 g 为奇数。转移只用枚举当前点颜色以及与哪些异色点连边。以白色为例,枚举连黑色个数 l≤k,系数为 (kl)2n−1−k。直接转移为 O(n4)。
注意到当 k≠0 时,n∑i=0[imod2=0](ni)=n∑i=1[imod2=1](ni)=2n−1,即贡献给 k 和 k+1 系数相同,都为 2n−k−1×2k−1=2n−2。于是只用设 dpi,0/1/2,0/1/2 表示当前黑白个数为 0 / 奇数 / 偶数方案,时间复杂度 O(n)。
容斥原理与二项式反演
容斥原理
给定 n 个集合 S1,…,Sn, 若我们能快速算出它们的一些交集的大小,那么可以计算它们的并集大小:
|n⋃i=1Si|=∑∅≠T⊆[n](−1)|T|−1|⋂i∈TSi|
其中 [n]={1,2,…,n},柿子的含义是若干集合的并集可以用它们的非空子集的交集乘上一个容斥系数得到。
Proof:
考虑每个元素对答案的贡献:为 n∑i=1(−1)i−1(ni)=0+(n0)=1
形式二:|¯n⋃i=1Si|=∑T⊆[n](−1)|T||⋂i∈TSi|
直观的理解就是:n 件事都不发生的方案,等于钦定某些事件的数必须发生的方案乘上 (−1)k, 而至少发生一件就等于总方案1减去第一个。
例题1:错排问题
求 1−n 的排列 pi, 使得 pi≠i。
容斥,钦定 k 个位置 pi=i 后其他任意选,容易写出答案:
ans=n∑k=0(−1)k(nk)(n−k)!
还可以使用生成函数更高效地递推。
例题 2 [SDOI2013]方程
n+m 个变量,要求 x1≤a1,…,xn≤an,xn+1≥an+1,…an+m≥an+m, 求 x1+x2+⋯+xn+m=S 的方案数。
先把 S 减去 an+1,…,an+m,再考虑容斥:钦定集合 S 中的 xp>ap, 此时可以用插板法解决,最后乘上 (−1)|S| 。
例题 3
n 个字符串 Ti, 每个字符串有问号表示可以填上任意小写字母,求所有填写方案中这些串构成的字典树节点数之和。
设 Si 表示第 i 个字符串在字典树上所对应的集合,我们要求 |⋃Si|, 考虑容斥变成每个子集的 S 的交。
而 S 的交就是它们的 LCP,枚举 LCP 长度算贡献即可。
例题 4 :[AGC005D] ~K Perm Counting
计算排列 pi 的数量,要求任意 |pi−i|≠k, O(n2)。
考虑容斥,那么相当于一个 i 能和 i+k 和 i−k 匹配,这是个二分图。
边会把这个二分图拆成若干条链, 我们只用分别计算每个长度为 x 的链中选 y 个的方案数然后卷起来即可。
考虑枚举最后一条边选或不选, 得到方案数为 (x−yy)+(x−1−y+1y−1)=(x−y+1y)。
例题 5:[ARC101C] Ribbons on Tree
2n 个点的树, 要求点之间两两配对使得路径覆盖整棵树的方案。 O(n2)
直接 dpx,i 表示 x 子树内有 i 个点没有配对, 转移直接枚举 x,y 配对点个数, 复杂度为 O(n3)
考虑容斥,计算钦定边集 E 不选乘上 (−1)|E| 的方案,可以看做割掉这些边后剩下的连通块内部两两匹配, 方案数为 (siz−1)!!。 注意我们不能把钦定的边集大小算进 dp 里面。
设 dpx,i 表示 x 的连通块大小为 i 的容斥系数之和, 注意 x 的连通块的答案是没有累加的。
转移直接考虑 (x,y) 边删不删, 不删就是直接背包, 否则就是 (−1)×∑fy,i×(i−1)!! 贡献到每个 fx,i。
子集反演
设 f(S)=∑T⊆Sg(T),则 g(S)=∑T⊆S(−1)|S|−|T|f(S)。常用于计算一个集合内部所有数满足某个条件的方案。且 f(S) 表示钦定所有元素都在 S 集合的方案,通常是好算的,即可通过子集反演式得到恰好为 T 的方案。
同样存在超集反演式:设 f(S)=∑S⊆Tg(T),则 g(S)=∑S⊆T(−1)|T|−|S|f(T)
证明是简单的,考虑一个大小为 k 的集合对答案的贡献为:n−k∑i=0(n−ki)(−1)n−i−k=[k=n](−1)n−k=[k=n]。
例题1:[ZJOI2016]小星星
记录下图中连边后,显然可以设 dpi,j,S 表示 i 子树标号集合为 S,i 标号为 j 的方案,转移显然。时间复杂度 O(3n×n2)。
显然最麻烦的条件是“1,…,n 中所有数都出现一次”,考虑容斥,钦定一个集合 S,S 中的点不出现,对于剩下的点,设 fx,i 表示 x 选择第 i 个未被钦定的点的方案,转移显然。但时间复杂度优化到了 O(2n×n2)。
例题2:[SHOI2016]黑暗前的幻想乡
对“每个建筑公司都要修一条边" 进行容斥,设 f(S) 表示钦定 S 集合中的公司不修的方案,显然可以用 Matrix - Tree 定理求得,答案是 ∑S(−1)|S|f(S)。
时间复杂度 O(2nn3).
例题 2:[ZJOI2022] 树
设 f(S) 表示第一棵树中非叶子节点集合为 S 的方案,g(S) 表示第二棵树上非叶子节点为 S 的方案,通过一些对称性的推导,可以发现 f(U)=g(U/S)。
因此问题变成了两棵树,满足非叶子节点相同的方案。
“非叶子”这个条件不好处理,设 g(S)=∑T⊆S,等于非叶子为 S(强制有 1) 子集的方案,这容易计算:g(S)=n∏i=2(∑x∈S(x<i))。
根据子集反演,f(S)=∑T⊆S(−1)|S|−|T|g(T),因此答案为:
∑S∑T1⊆S,T2⊆S(−1)2|S|−|T1|−|T2|n∏i=2(∑x∈T1[x<i])(∑x∈T2[x<i])
可以通过 dp 计算后面的:设 dpi,j,k 表示考虑到前 i 个点,目前 |T1|=j,|T2|=k 的总贡献。每次转移 i 考虑 i 是否加入 S / 加入 S 后是否加入 T1/T2 即可 O(1) 转移。
时间复杂度 O(n3)。
二项式反演
从钦定 k 个 -> 恰好 k 个的转化。 可以理解为特殊的子集反演。
问题:n 个集合 S1,S2,…,Sm, 现在要计算恰好在 k 个集合的元素个数,并且任选 k 个集合的答案是一样的。
设 f(n) 表示钦定 n 个的答案, g(n) 表示恰好 n 个的答案, 若有:
形式 1 :f(n)=n∑i=0(ni)g(i)⇒g(n)=n∑i=0(−1)n−if(i)
形式 2:f(n)=∑k≥n(kn)g(k)⇒g(n)=∑k≥n(−1)k−n(kn)f(k)
例题 1:已经没有什么好害怕的了
有 n 个糖果 和 n 个药片,能量分别为 ai,bi, 两两匹配, 求恰好有 k 对糖果能量大于药片方案。
二项式反演,计算钦定 k 组的答案 f(k), 答案显然是 n∑i=k(−1)i−k(ik)f(i)。
将糖果和药片排序, 设 fn,m 表示考虑到前 n 个糖果, 目前已有 m 对 ai>bi 的方案, 转移直接枚举 ai 是否匹配即可。 剩下 n−i 个任意匹配, 将 fn,i←fn,i×(n−i)! 即可。
例题2 :[HAOI2018]染色
在一个长度为 n 的序列上染色, 每个位置可以染 m 种颜色,定义一个染色方案的权值为其中出现次数恰好为 k 的个数 cnt, 贡献为 valcnt, 求所有染方案的贡献。 O(nlogn)
很明显的二项式反演的形式,设 f(n) 表示钦定 n 个颜色出现恰好 k 次 , 不难得到:
f(p)=(mp)(nkp)(kp)!(k!)p(n−kp)m−p
有 f(n) 和 g(n) 的转化:
g(k)=∑n≥k(−1)n−k(nk)f(n) ,显然的卷积的形式,用 NTT 优化即可。
例题3 :CF997C Sky Full of Stars
n×n 的网格图, 用三种颜色染色, 求有多少种染色方案使得至少有一行或一列为同一种颜色。 O(n)
考虑用总的 3n2 减去恰好有 0 列 0 行相同的方案数。
设 f(i,j) 表示钦定 i 行 j 列相同的方案,g(i,j) 表示恰好 i 行 j 列相同的方案,则有二维二项式反演:
g(x,y)=n∑i=xn∑j=y(−1)i+j−x−y(ix)(jy)f(i,j),原因是每一个维度相互独立。我们要求的就是 f(0,0)。
考虑分别计算只有行 / 列相等,都有的方案,对于前者,显然是:
f(i,0)=(ni)3i3n(n−i)。
对于后者,也容易写出 :f(x,y)=(nx)(ny)3(n−x)(n−y)+1。
带入 g(0,0) 可得(只考虑第二部分,第一部分容易计算):
预处理 3 的幂次即可线性。
例题 4:[ICPC2018 WF]Gem Island
容易发现,假设第 i 个人得到了ci 个宝石,方案数为 d!n∏i=1ci!n∏i=1ci!=d!,因此对于所有的 ci,其方案数是相同的,又因为总方案为 n¯d,因此问题变成计算 ∑ci=n 的前 k 大和。
我会 dp!注意到 ci 本质上是 n 的一个拆分,我们将 i 作为横坐标,ci 作为纵坐标画出阶梯型图。可以在每次将若干个数 + 1 的过程中统计答案。设 dpi,j 表示当前总和为 i,目前有 j 个人钦定为最大值。每次转移枚举 k(k≤j) 个矩形将其 + 1,贡献为 min(r,k),方案为 (jk)。时间复杂度 O(n3)。
我会容斥!先转为 ≥:设 fi,j 表示有 i 个人得到 ≥j 个宝石的方案,答案是 ∑i,jfi,jmin(i,r)。
fi,j 表示恰好,考虑二项式反演:gi,j 表示钦定 i 个人得到 ≥j 个宝石,方案为 (ni)(d−ij+n−1n−1)。
设 gk=∑jk≤n(d−jk+n−1n−1),显然可以 O(nlnn) 预处理,可以 O(n2)。
还不够。
考虑
可以拆成 i≤r 和 i>r 两部分,都容易 O(1) 求解,时间复杂度 O(nlnn)。
Prufer 序列
一种 n 个节点的有标号无根树到一个长度为 n−2,每个元素都在 [1,n] 的双射。
树生成 Prufer 序列:
Prufer 序列的定义是这样的:每次找到编号最小的叶子节点,将它所连向的点加入序列,删除这个点。重复执行到树中只剩两个点。
可以用一个指针维护当前编号最小的叶子节点,删去它后,可能出现比当前点小的点一定是它父亲,反复执行即可。
Prufer 序列生成树:
类似的思路,先通过 Prufer 序列得到每个点的度数,不断找到编号最小的叶子并把他的父亲设为当前 Prufer 序列的元素,将其删去,继续寻找新的可能比当前小的叶子节点。
Prufer 序列的推论:
- n 个点的有标号无根树个数为 nn−2, 这也是 n 个节点的无向完全图生成树个数。
- n 个点的有标号有根树方案为 nn−1, 度数为 d 的点在 Prufer 序列中出现了 d−1 次。
- n 个点,每个点度数为 di 的有标号无根树方案为 (n−2)!∏(di−1)!
- 将 m 个连通块,每个连通大小为 ai 的森林加边形成树的方案数为 :nm−2×∏ai。
简单证明:利用 Matrix-tree 定理得到:
删去最后一行列得到的矩阵为:
每一行提取 ai 得到:
将 2−m−1 列加到第一列得到:
将 2−m−1 行减去第一行得到:
为 ∏iai×nm−2。
-
n个点形成 k 个森林,使得指定的 k 个点不在同一连通块中,方案为:knn−k−1。
Proof:加上虚点 0 与指定 k 个连边,于是相当于 n+1 个点,其中 0 出现了 k−1 次的方案,总方案 (n−1k−1)nn−k,由于任选 k 个点的答案是相同的,根据除法原理可知为 (n−1k−1)nn−k(nk),化简即是答案。
例题1:CF917D Stranger Trees
进行二项式反演,变成钦定一些原树的边后得到的联通块,任意连边形成树的方案。根据经典结论可知为 nm−2×∏iai,设选择了 k 条边,则有 n−k 个连通块,因此只要对每个 k 算出 k 个连通块总方案的 ∏ai 即可。
我会暴力 DP!设 dpx,i,j 表示 x 子树内已经有 i 个连通块,目前 x 所在连通块大小为 j 的方案。直接枚举相邻点之间边是否断掉做背包,时间复杂度 O(n3)。(由于数据范围太小能过
我会组合意义!∏iai 的组合意义是从每个连通块中选出一个点的方案,于是设 fx,i,0/1 表示 x 子树内有 i 个连通块,目前 x 所在连通块是否选点的方案。若选择断开,则 fx,i+j,0/1←fx,i,0/1×fy,j,1,若不断则需保证 x 和 y 连通块不能都选点。
时间复杂度 O(n2)。
例题 2:[清华集训2017]生成树计数
若有 n 个连通块,每个大小为 ai,每个连通块度数为 di 连成一棵树的方案为:n∏i=1adii×(n−2)!n∏i=1(di−1)!, 枚举每个点的度数
注意到前后两个形式类似,考虑设 A(x)=∑k≥1k2m(k−1)!xk ,B(x)=∑k≥1km(k−1)!xk,则 =[xn−2]n∑i=1A(aix)∏j≠iB(ajx)=(n∑i=1A(aix))×(n∏i=1A(aix)B(aix)))。
考虑前面一部分,∑A(aix)的 k 次项系数为 A[k]×(n∑i=1aki),可以预处理每个 k 次幂 ck=n∑i=1aki 计算。
考虑后面一部分,经典 Ln + Exp:=exp(n∑i=1ln(A(aix)B(aix))。同样可以利用 ck 计算,但 [xn]Fk(x)=[x−k]1nG−n(x)。
例题 3:LOJ#3399. 「2020-2021 集训队作业」Communication Network
类似 [WC2019 数树] 一样的做法,先用 prufer 序列的推论进行子集反演,再将柿子进行组合意义优化。
设 f(S) 表示与原树交恰好为 S 的方案,子集反演:f(S)=∑S⊆T(−1)|T|−|S|g(T),其中 g(T)=nn−|T|−2×∏ ai。
考虑其组合意义:枚举所有的原树边集合,每选出一条边贡献为 (−1n),边集的贡献为所有边的乘积,同时在边集形成的连通块中每个连通块选择一个点。再选出边集的一个子集 S,选出一条边贡献为 (−2),再在子集 S 里面选择一条边的方案。
对于每个连通块分开考虑,则一个连通块的贡献只和是否选点和边有关系,设 dpx,0/1,0/1 表示 x 所在连通块,是否选点,是否选边。
转移:对于儿子 y,若 (x,y) 不选则 dpx,i,j|v←dpx,i,j×dpy,1,v。
若 (x,y) 选,则考虑该边是否加入 S,加入 S 后是否成为选择的那条边,有:
dpx,i|u,j|v←(−1n)×dpx,i,j×dpy,u,v,dpx,i|u,j|v←(−1n)×(−2)×dpx,i,j×dpy,u,v i+u≠2,j+v≠2。
dpx,i|u,1←(−1n)×(−2)×dpx,i,j×dpy,u,v j=v=0。
时间复杂度 O(n)。
例题 4【2.17省选模拟】樟
给出长度为 n 的排列 {pi},计数 n 个点带标号无根树数量。满足限制:
若存在树边 (i,j),则存在树边 (pi,pj)。
当 pi=i,即没有限制,答案为 nn−2。
若所有置换都是对换,容易发现有且仅有一个二元组 (x,y) 作为根,剩下的二元组可以看做单点,设二元组个数为 n′,于是方案数为 2n′−1n′n′−1。
当所有元素是单点或孤立点时,孤立点不能通过和二元环连边和其他孤立点连边,这必然出现环,设 a 个孤立点 b 个二元环,钦定了 k 个二元环和孤立点连边,于是要计数 b 个点形成的 k 个森林方案数,使得指定的 k 个点不在同一方案数为 aa−1(bk)kbb−k−1ak2b−k。
当没有孤立点和二元环时,打表可知答案为 0。
更一般地,设 occi 表示大小为 i 的置换环个数。考虑两个大小不同的大小 i,j(i<j) ,他们可以连边当且仅当 i∣j 。(Lemma 1)
Proof:
必要性:设 g=gcd(i,j),则 g≠i,考虑将 i,j 中连续的 g 个数一起考虑,设 i′=ig,j′=jg,此时形成了一个完全图,而由于 i′≥2,必然存在环。
充分性:当 i∣j 时,显然每个 i 连向的数互不相同,显然不是环。
Lemma 2:除二元环外,不存在环内部的边。
显然当 n 为奇数成立。当 n 为偶数是当且仅当 l=n2 合法,此时形成 n2 个小环。
讨论这些环的连通情况。若连向其因数易证会形成环。
若连向其倍数连通块个数不会改变。
考虑如何计算最终答案,当 l=1,2 时已经形成一棵树了,我们不妨从小到大拼上所有置换环,类似 l=2 枚举有多少个数与其因子相连,对于都为 i 的环拼接的方案为 i,否则与 j(j∣i) 拼接方案为 j,于是对于单个 i,方案为:
总方案为所有 i(i≥3) 的方案相乘,再特殊处理 i=1,2 的情况。
时间复杂度 O(nlogn)。
Min - Max 容斥
一种集合最值通过容斥原理的互化。
普通 Min - Max 容斥
对于集合 S,有:
证明 so easy:对于 S 中第 k 大的数,其在右边的系数为 :k−1∑i=0(k−1i)(−1)i=[k=1],对于最小值同理。
其在期望下同样成立,具体地,设 E(maxS) 为集合最大值的期望,E(minS) 为集合最小值的期望,则有:
一个直观的应用是:一个集合 S,每个单位时间出现一个数(可重复),每个数出现的概率为 pi,求所有数都出现的期望时间。
此时 maxS 为集合中最晚出现数的时间,但 minS 表示第一次出现集合 S 中数的时间,显然可以通过简单概率求解。
扩展 Min - Max 容斥
将最大改为了第 k 大,设 kthmx(S) 为集合第 k 大数,kthmn(S) 同理,则有:
证明:类比上面的证明即可。
例题 1: [HAOI2015] 按位或
根据普通 Min - Max 容斥的推论,只需要对每个非空子集 T 算出 P=∑i and T≠∅pi,答案就是 1P。
交非空不太好算,简单容斥一下算交为空的,等价于 ¯T 的子集,FWT。
例题 2:P4707 重返现世
所求即是 E(kthmn(S))。根据扩展 Min - Max 容斥,只需计算 (|T|−1k−1)(−1)|T|−kmax(T)。但由于 |n−k|≤10 ,将 k←n−k+1, 等价于 E(kthmx(S))。而 E(min(T))=1∑i∈Tpi 。
直接枚举所有子集不太现实,考虑利用组合数的递推性质递推求解上式。
设 dpi,j,k 表示当前考虑到前 i 个元素构成的子集,∑pu=j,当前 k 的答案。总答案为 dpn,j,k×mj。若选择 i 则 j←j+pi, 所有的 (−1)|T|−k(|T|−1k−1) 变成 (−1)|T|+1−k(|T|k−1)=(−1)×(−1)|T|−k(|T|−1k−1)+(−1)|T|−(k−1)(|T|−1k−2)。 由 dpi−1,j−pi,k−1−dpi−1,j−pi,k 转移即可。每次滚动转移,时间复杂度 O(nmk)。
例题 3:[AGC038E] Gachapon
Min - Max 容斥后,变成对于每个非空集合 S,计算出刚好存在一个 p 出现次数 ≥Bp 的期望时间,注意到时间有限,转化成对于每个时刻 t 计算 t 时刻还不存在的概率相加。
容易写出生成函数:∑AiS∑t[xtt!]∏p(1+Apx+(Apx)22!+…(Apx)Bp−1(Bp−1)!) 。
注意到 ∑A≤400,∑B≤400,于是直接将 ∑A,xt 计入 dp 状态后 O(n3) 转移。
例题 4:[PKUWC2018]随机游走
由于 n≤18,Min - Max 容斥后,变成对于每个非空集合 S,计算 x 第一次到达 S 中某个节点的期望时间。然后 FWT 就是答案。
枚举 S,设 fu 表示从 u 出发期望时间,∀x∈S,fx=0,对于其它点,fx=1degx(∑fy)+1。
直接 gauss 消元复杂度太劣,对于这种树上随机游走问题,我们可以证明:每个 fx 都可以写成关于父亲的一次函数,即 fx=kxfprt+bx。
树形 dp,从下往上推出根节点的 f:
对比系数可知,kx=1degx−∑ky,bx=∑by+degxdegx−∑ky。
时间复杂度 O(2nn)。
NOIP一轮复习:生成函数
普通生成函数
对于无穷数列 {hn}, 定义其普通生成函数(Ordinary General Function)为 ∞∑i=0hixi。
xn 充当了 hn 的占位符,称为生成函数中的核函数 ker(x)=xn。随着核函数的不同,生成函数也会发生变化,例如指数生成函数中核函数 ker(x)=xnn!。
常用数列的生成函数:
-
<0,1,12,13,…1n> 的生成函数为 ln11−x=−ln(1−x)
-
<1,(m+1m),(m+2m),⋯> 的生成函数为 1(1−x)m+1
-
<0,1,1,2,3,⋯> 即斐波那契数列生成函数为 11−x−x2。
如何通过生成函数封闭形式解出通项?分式分解即可,即把一个分式写成若干个形如 a1−bx 的形式,对于第 n 项的贡献显然为 a×bn。
-
<1,1,2,5,14,⋯> 即卡特兰数的生成函数封闭形式为 1−√1−4x2x
-
多项式 F(x) 偶数项的提取:F(x)+F(−x)2, 奇数 F(x)−F(−x)2。
例题
例题1:CF438E The Child and Binary Tree
设 F 为答案的生成函数,A 为输入的 ai,则有:
F=AF2+1,求解得到 F=1±√1−4A2A, 考察 x→0 时的收敛性可知 F=1−√1−4A2A。
例题2:[MtOI2018]情侣?给我烧了!
求导递推通项。
答案显然可以写成:(nk)2k!2kfn−k, 其中 fn 表示 n 对情侣错排的方案数。
而我们有等式:n∑k=0(nk)2k!2kfn−k=(2n)!, 化简得到:
n∑k=0(n!)2k!2kfn−k=(2n)!⇒n∑k=02kk!fn−k=(2n)!(n!)2 ,2kk! 显然为 e2x,(2n)!(n!)2 为 1√1−4x ,因此有:
F(x)=e−2x√1−4x, 考虑对 F 求导,可得 F′=−2e−2x(1−4x)+2e−2x(1−4x)32=8xe−2x(1−4x)3/2=8x1−4xF, 所以有递推式:
(1−4x)F′=8xF⇒(n+1)fn+1−4nfn=8fn−1, 所以 fn=1n(4(n−1)fn−1+8fn−2)
例题3:BSOJ7094
先把操作取反,计算出一个排列 p,经过最少多少次将一个开头或结尾插入任意一个位置的操作变成起始排列。
手玩几组数据可以发现,最优方案中一定有一个区间 [l,r] ,满足 [l,r] 是单调递增的,而 [1,l−1] 和 [r+1,n] 的数都插入 [l,r] 中。
设一个排列最长的极长上升连续段长度为 k ,则最少需要 n−k 次操作。
而我们要计数至多,考虑对末尾的连续段进行 dp,设 dpi,j,k 表示考虑到前 i 个数,最后一个数的相对大小为 j,目前的最长上升子段长度为 k 的方案。强制只让 k≤t 转移。时间复杂度 O(n4) 。
考虑优化,我们考虑容斥,一个基本单位是 x1+⋯+xt−1=x−xt1−x,设 G(x) 为长度为 n 的容斥系数,容斥掉他们拼起来的情况:
11−G(x)−1=x−xt1−x⇒G(x)=x−xt1−xt
而实际的拼接为 EGF 的形式,多项式求逆即可。
计算 k 时只有 nk 个非 0,因此时间复杂度为 O(n(n∑i=1ni))=O(n2lnn)
例题4:BSOJ7092
答案显然为 n∑i=0i(ni)Catn−i,其中 Catn 表示卡特兰数。但这样不好直接优化。
考虑直接把答案写成生成函数的形式,设 F(x) 表示合法的括号序列的 OGF,G(x) 表示所有合法序列中 x 的出现次数的 OGF,则有 F(x)=xF(x)+x2F2(x)+1,G(x)=x(F(x)+G(x))+2x2F(x)G(x)。
解一下 F 和 G 可以得到 F=1−x−√1−2x−3x22x2, G=xF1−x−2x2F=1−x√1−2x−3x2−12x。
现在只考虑 1√1−2x−3x2 怎么算,其他的都是一些简单的线性变换。
同样考虑求导后递推,可以得到:F′=−12(1−2x−3x2)−3/2 ,提取系数后 (n+1)fn+1−2nfn−3(n−1)fn−1=−12fn,递推即可,
例题 5:【CTSC2018】青蕈领主
指数生成函数
形式幂级数 ˆG(x)=∑gnxnn! 称为 {gn} 的指数生成函数。又称为 EGF。
两个 EGF 的乘法为二项加法卷积,也就是:(F∗G)[n]=n∑k=0(nk)F[k]G[n−k]
常用数列的 EGF:
- (1,c,c2,…)=ecx
- (1,0,1,…,(−1)n)=ex+e−x2。
- (1,a,a2_,a3_)=(1+a)n
- 单个排列的 EGF 为 −ln(1−x),圆排列 EGF 为 −ln(1−x)−x。
多项式 Ln 的组合意义:若 F(x) 为一般图的生成函数,则 lnF(x) 为连通图的生成函数。
多项式 Exp 的组合意义:若 F(x) 为连通图的生成函数,则 expF(x) 为一般图的生成函数(一般图由若干个连通图拼接而成)
例题
例题1:错排问题
若对于一个排列 pi, ∀i,pi≠i ,则称这个排列是一个错排。
根据定义,显然有 Dn=n∑i=0(ni)(−1)i(n−i)!。
若要求得通项公式,我们可以考虑生成函数 e−ln(1−x)−x,对它进行求导递推通项即可。
例题1:【LOJ6503】「雅礼集训 2018 Day4」Magic
套路地二项式反演,有 k 个魔术对等价于有 n−k 个连续段,考虑算出一个颜色的连续段生成函数 Fk(x),答案就是所有颜色相乘。
设 fn 表示钦定有 n 个连续段的方案,答案就是 n∑i=k(−1)i−k(ik)ansn−i
对于单个的 F(x),若有 k 段,方案数就是方程正整数解数量 (cnt−1k−1)。
例题2:BSOJ7069
一条哈密顿路径的点序列最少需要添加的边的数量为相邻的绝对值不为 1 的数量。考虑计算至少有 n−k 对相邻绝对值为 1 的排列个数。
将相邻绝对值为 1 的位置缩成一个连续段,答案就是至多 k 个连续段的数量。
一个段的排列方案有递增和递减(长度为 1 除外),于是其生成函数 =x+2x2+2x3+⋯=x2+x1−x。
则 fl=l!×(x2+x1−x)l=[xl]l!(1+x)l(11−x)l=[xl]l!l∑k=0(k+l−1l−1)×(lk)。
二项式反演后两次卷积。
例题3:[CTS2019] 珍珠
演反式项二。设值为 i 的数出现了 cnti 次,则题目的要求就是:
D∑i=1⌊cnti2⌋≥m⇒D∑i=1cnt−(cnt&1)2≥m⇒n−D∑i=1cnti&1≥2m
D∑i=1cnti&1≤n−2m,因此当 n−2m<0 时答案必为 0, n−2m≥D 时答案必为 Dn。
否则设 fk 表示钦定 k 个数出现次数为奇数次,则有:
两次卷积。
例题4:[WC2019] 数树
task 1:显然,将两棵树中都有的边合并后,形成若干个等价类,等价类内部方案为 y,答案就是 yn−cnt。用 map 随便统计即可。
task2:首先列出答案式:ans=∑T2yn−|T1∩T2|。 因此我们要计数恰好有 k 对边重合的树的方案。
看到恰好就想反演,只不过此时我们要对集合反演。
有子集反演式:
带入得到:
其中 g(T) 表示 T2 和 T1 交集至少为 T 的方案。
凑成二项式定理的形式:
把枚举边改为枚举点。而已知若干个联通块,把他们加边形成树的方案,显然使用 Prufer 序列:
=∑Tyk(1−y)n−knk−2∏iai=(1−y)nn2∑T∏iany1−y
因此问题变成对于每一个连通块计算 k∏i=1aiy1−y。 设 dpx,i 表示 x 子树内,x 的连通块大小为 i 的总权值之和。转移枚举 (x,y) 的边删不删可以做到 O(n2)。
然而这不够,我们考虑怎么优化成 O(n),注意到 any1−y 的组合意义:从大小为 a 的连通块中选一个点,每个点的权值为 ny1−y。求总选择的方案数。
改变 dp 状态为 dpx,0/1 表示 x 所在连通块是否选择过点的方案,可以 O(n) 转移。
task3:现在第一棵树也没有了。我们仍然可以枚举 ai,再加上第一棵树的连边方案:
ans=(1−y)nn2∑aink−2(k∏i=1ai)(k∏i=1any1−y)=(1−y)nn4∑ai=n∏ia2n2y1−y
我们只用求出单个大小为 n 的树的个数,将系数相乘后做 exp 即可,单个的 EGF 为:
F(x)=∑a≥1a2×aa−2×n2y(1−y)a!=∑a≥1aa×n2y(1−y)a!。
符号化方法
初始概念
- 组合对象:满足某一性质的树,图,串等。
- 组合类:组合对象构成的集合。 设 |a| 表示 a 的大小。
- 中性对象 ϵ 为一个大小为 0 的组合对象,对应 OGF $ = 1,并规定任意组合类,A^0 = \epsilon$。
- 原子对象为一个大小为 1 的组合对象,为 Z(x)=x。
- 笛卡尔积:从每个集合中各取一个数形成的有序多元组称为 A1,A2,…,An 的笛卡尔积,记作 A1×A2×⋯×An.
- 若两个组合类同构则称 A=B。
- 对于组合类 A, 若其中的组合对象均由组合类 B 中的对象组合而成,定义 a∈A 在 B 上的拆分为 a=(b1,b2,…,bm), 记作 capB(a)=m。
- 令 G=(G0,G1,…,Gk) 为一个置换群列,其中 Gk 包含若干个大小为 k 的置换,定义两个组合对象 a1,a2 等价,当且仅当 capB(a1)=capB(a2), 且 ∃g∈GcapB(a1) ,g(a1)=a2。
- 定义 A/G 表示 A 在 G 中拆分后,用置换 G 消序后得到的等价类。
无标号体系
无标号:组合对象之间无序,可以看做一个集合。
常用无标号构造。
-
无标号 sequence 构造
使用若干个 A 中元素构成不定长集合,记作 SEQ(A)=ϵ+A+A2+⋯=11−A,要求 A 没有常数项,否则会产生无穷大。
-
无标号 Multiset 构造
如其名,令 G 为全体置换,生成无序集合 MSET(A)=SEQ(A)/G。
组合意义为完全背包,又称为欧拉变换。
下面来推导 MSET 的公式。
由于无标号,直接笛卡尔积起来会 算重,我们强制按照字典序从小到大加入若干个元素,有:
B=MSET(A)=∏a∈A(11−x|A|)=∏i≥1(11−xi)Ai
=exp(∑i≥1Ailn11−xi=exp(Ai∑j≥1xijj)=exp(∑j=11j∑i≥1xijAi)
=exp(∑j≥1A(xj)j)
据此可以直接调和级数在 O(nlnn) 的时间内得到系数,然后再 exp 回去。
例题
例题1:P4389 付公主的背包
MSET 模板题。
例题2:LG P5900 无标号无根树计数
先解决无标号有根树计数,设 T(x) 为无标号有根树的生成函数, 我们有:
-
法 1 :牛顿迭代:
设 G(T(x))=lnT(x)x−T(x)−∑j≥2T(xj)j
对于 j≥2, 我们已经知道 ∑j≥2T(xj)j(modx2n) 的值, 把它看成一个常数 C。
直接算即可。
-
法 2 :分治 FFT:
考虑求导后再提取系数。
设 $G(x) = \sum\limits_{j \geq 1}T'(x^j)x^j$
于是 $G(x)$ 的系数可以在调和级数复杂度内完成。
两边同时提取 $[x^n]$ :
半在线卷积即可。
有标号体系
有标号:EGF。
常用有标号构造
- 有标号笛卡尔积:重新强标号,且两个组合类内部标号相对顺序保持不变。
- 有标号 sequence 同无标号 sequence。
- 有标号 set 构造:令 G 是全体置换组成的置换群列,生成无序集合的构造 SET(A)=SEQ(A)/GA。EGF 为 B(x)=∑k≥0Ak(x)k!=expA。
常见组合类的 EGF:
- 圆排列 EGF 为 −ln(1−x)
- n 元置换 EGF 为 11−x
- 错排 EGF 为 e−ln(1−x)−x
- 有标号连通图 EGF 为 ln(∑n≥02(n2)xnn!)
- 有标号欧拉图 EGF:ln(∑n≥0)2(n−12)xnn!
例题
例题1:P4233 射命丸文的笔记
分子是好求的,本质不同的哈密顿回路有 (n−1)! 个,答案就是 (n−1)!2(n2)−n
考虑分母,由于图是一个竞赛图,缩点后会形成一条链,又还有哈密顿回路,所以锁点后只剩下一个点,设 F(x) 为哈密顿回路竞赛图的 EGF,则 SEQ(F) 表示了所有竞赛图,即 G(x)=∑n≥02(n2)xnn!, 所以 11−F=G⇒F=1−1G 。
例题2:有标号 DAG 计数
考虑先求出任意 DAG 的 EGF,然后取 ln 就是弱连通图 DAG。
设 hn 表示 n 个点的 DAG 个数,简单的想法是枚举入度为 0 的点,然后所有入度非 0 的点向它连边,但显而易见,这样做会让多个入度为 0 的点重复统计。
考虑二项式反演,设 fn 表示钦定 n 个零入度点, gn 表示恰好 n 个零入度点,则有:
fk=(nk)2k(n−k)hn−k, gk=∑n≥k(−1)n−k(nk)fn,带入得:
hn=n∑i=1ansi=n∑i=1∑j≥i(−1)j−i(ji)(nj)2j(n−j)hn−j
hn=n−1∑j=0(−1)n−j2j(n−j)hjn−j∑i=1(ni)(n−ij)(−1)i
=n−1∑j=0(−1)j−12j(n−j)(nj)
例题3:有标号二分图计数
设 F(x),G(x) 分别为连通二分图,一般二分图的方案,显然 G(x)=exp(F),但是 F 并不好求,因为枚举左右部点加边时仍然会不连通,考虑这样子求出来的图是什么,发现是连通二部图的方案(每一个连通二分子图有两种染色方案)
设 H(x)=∑n≥0∑k≤n(nk)2k(n−k)xn,则有 H(x)=e2F, G(x)=eF⇒G(x)=√H(x),多项式开根即可。
例题4:有标号仙人掌计数
例题5:【ZJOI2018】树
假设我们对于所有无标号有根树求出按照题目所给方式标号的方案数,设为 f(T),答案显然可以写成:1(n−1)m∑|T|=nfm(T) 。
而题目要求的无非就是父亲节点编号严格小于儿子节点,等价于拓扑排序方案数,但注意对于同一个点的互相同构的儿子,他们之间没有顺序,因此 f(T)=|T|∏x1sizx∏x1wx,i!,接下来考虑直接对这个系数进行 dp。
设 dpn=∑|T|=nfm(T),枚举根节点儿子可得 :
化乘为加:
考虑 B(x)=ln(∑k≥0xk(k!)m),上面其实是代入 B(xifm(T)),稍作代换:
发现右侧出现了 ∑|T|=i(xifm(T))k 的形式,我们重新定义 dpn,t=∑|T|=nfkt(T) ,则重新改写为:
设 Bt=ln(∑k≥0xk(k!)tm),则有:
动态维护 Pt=exp(∑k≥0([xk]Bt)∑idpi,ktxik),答案即是 dpn,1。
直接 dp 有点慢,考虑分析各个变量的取值后可以得到更确切的上界为 O(n2logn)
附:O(n2) 多项式 exp,ln :
B(x)=expA(x)⇒B′(x)=exp(A(x))A′(x)=B(x)A′(x), 所以 Bn=1nn∑i=1iAiBn−i
B(x)=lnA(x)⇒B′(x)A(x)=A′(x),所以 Bn=An−1nn−1∑i=1iBiAn−i
贝尔级数
贝尔级数
针对在素数幂取值得到的生成函数。即:
贝尔函数的最大用处是结合杜教筛快速构造 f=g∗h 中的 h。
常见数论函数的贝尔级数为:
- 单位函数 ϵ(x)=1。
- 常函数 I(x)=11−x。
- k 次幂函数 idk(x)=11−pkx。
- 欧拉函数 φ(x)=1+∑i≥1pi−1(p−1)=1−x1−px
- 莫比乌斯函数 μ(x)=1−x。
- 无平方因子函数 u(x)=1+x。
- 约数函数 σ(x)=∑i(i+1)xi=1(1−x)2。
- 约数和函数 σk(x)=1(1−pkx)(1−x)。
- w(x)=2x不同素因子个数=1+2∑i≥1x=1+2x1−x=1+x1−x。
- 刘维尔函数 λ(x)=11+x
常见推论:
- (f∗g)p(x)=fp(x)gp(x)。
- 贝尔级数点积 ϵ 变成 ϵ。点积 I 保持不变。
- 点积 idk 等价于换元 x←pkx。
常见狄利克雷卷积:
- φ=id∗μ
- ϵ=id∗μ
- σ=I∗I。
- σk=idk∗I
例 1:求 id∗(μ⋅id) 的狄利克雷卷积。
- 等价于 11−px(1−px)=1=ϵ。
例 2:求 μ2∗(id⋅μ) 的前缀和。
- 等价于 fp(x)=(1+x)(1−px),卷上 id 后变成 μ2。
- 而 n∑i=1μ2(i)=√n∑i=1μ(i)⌊ni2⌋ ,直接 O(√n) 计算。
例 3:计算 φ⋅id 的前缀和。
- fp(x)=1−px1−p2x ,卷上 φ∗I 变成 id2,容易杜教筛计算。
例题 4:计算积性函数 f(pk)=pk+[k>0](−1)k。
- fp(x)=11−px−x1+x=1+px2(1−px)(1+x)
- 卷上 (id⋅μ)∗μ2 后变成 (1+px2)。
- 考虑 hp(x)=1+px2 的组合意义,即 x 是完全平方数且 √x 不含平方因子。
- 因此 ∑h(i)=√n∑i=1μ2(i)i。容易 O(√n) 计算。
多项式复合& 拉格朗日反演
分式域与逆元
当 F(x) 无常数项时,F−1(x) 在普通的自然数域中没有定义。
在分式域中,只需将 F(x) 适当平移,使得存在常数项后操作,最后补回来即可。
例如:F(x)−n=x−n(F(x)x)−n
拉格朗日反演
拉格朗日反演主要针对形如 [xn]F(x)k 的柿子进行计算,并要求 F(x) 常数项为 0, 一次项系数非 0。
以下讨论的多项式均常数项为 0,一次项系数非 0。
定义两个多项式 F(x),G(x) 的复合为 F(G(x))=∑i≥0F[i]G(x)i
若两个多项式 F(x),G(x) 满足 F(G(x))=G(F(x))=x,则称 F,G 互为复合逆。
例如:F(x)=ln(1+x) 和 G(x)=ex−1 互为复合逆。
引理1:
证明:若 k≠−1,左式显然等于 1k+1(Fk+1)′,不存在 [x−1] 的系数。
若 k=−1, 等于 F′(x)F(x)=x−1×F′(x)F(x)x,常数项为 F[1]×1F(1)=1,所以 [x−1]F(x)kF′(x)=1。
拉格朗日反演的定理为:若 F,G 互为复合逆,则:
证明:
两边同时提取 [x−1]:
这就是拉格朗日反演的 general 的形式。
当 k=1 时,原式变成:[xn]F(x)=[x−1]1nG(x)−n=[xn−1]1n(x(G(x))n
扩展 1:再复合,一般称为“扩展拉格朗日反演”:
条件仍然是 F(G(x))=x,H(x) 为一个无要求的幂级数,则:
只用把初始恒等式改变即可。
扩展 2:直接复合:
若 G(F(x))=H(x),则有:
同样只用把初始恒等式改一下即可。
扩展 3:另类拉格朗日反演(只是对上面的展开形式不求导,直接乘上 F(x)−n−1F(x)):
你实在无聊到家,还可以有扩展另类拉格朗日反演:
例题
[BZOJ3684] 大朋友和多叉树
题目要求的是每个非叶子节点的儿子个数 cnt∈S 的方案,而且儿子之间有顺序,设 fn 为 n 个叶子的答案,F(x) 为其 OGF,显然有:
设 G(x)=x−∑c∈Sxc,则有 F,G 互为复合逆,于是:
直接计算。
LGP7445 「EZEC-7」线段树
首先对每一个线段树节点分开计算期望。
设当前区间为 [l,r],一次操作完全覆盖 [l,r] 的概率为 px=l(r−l+1)(n+12),枚举覆盖次数得到:
ansx=m∑k=0(mk)pkx(1−px)m−kfk, 其中 fk 为经过 k 次操作后不为 0 的概率,即:
方便起见,将 V←V+2,只用计算 fk=[x0](V−2∑i=−1xi)=[x0](1−xVx(1−x))k
直接拉反吗?不,fk 有负数次项,不符合条件,考虑 F(x)=[x0](1−xVx(1−x))k=[x0](x(1−x)1−xV)−k,设 G(x)=x(1−x)1−xV,显然 [x0]G(x)=0,[x1]G(x)≠0, 于是借用另类拉格朗日反演,设 H 为 G 的复合逆:
然后求出 H 卷一下就可以得到 fk 了,考虑 H 怎么算,因为:
牛顿迭代即可。
剩下的就是一个多点求值了,当然也存在分治的做法。
CF1349F2 Slime and Sequences (Hard Version)
先考虑 O(n2) 怎么做:由于我们要求 i 最后一次出现时有 i−1 出现。考虑这么一个双射:
初始有一个集合,每次从小到大枚举,每次把 i 出现的位置按从大到小排序后加入集合中,这会形成一个排列,而排列的上升数加一就是当前的最大值。容易发现一个排列和一个好序列形成双射。
枚举 i 出现的位置: ansi=n∑j=i+1⟨ji−1⟩n!i!。
O(n2) 预处理欧拉数即可通过 F1。考虑 F2。
F2 的瓶颈在于求 ansk=n∑i=k+1⟨ik⟩1i!。
我们有欧拉数的二项式反演做法:⟨nm⟩=n∑k=m(−1)k−m(km)[xnn!](ex−1)n−k ,考虑把 F1 的式的欧拉数拆开:
注意到后面的 n−j∑i=1[xj](ex−1x)i 只与 j 有关,设 fj=n−j∑i=1[xj](ex−1x)i,则求出 f 后与前面的卷一下就是答案。
设 F=ex−1x,先用等比数列简化:fj=[xj]F−Fn−j+11−F=F1−F−Fn−j+11−F。前面的直接算,考虑怎么算后面:
直接将 F 带入:=[xj]((ex−1x)n−j+11−ex−1x)=[xn]((ex−1)n−j+1x−(ex−1))。设 R(x)=ex−1,显然 R(−1)(x)=ln(1+x)。设为 D(x)。
考虑写成复合的形式:设 H(x)=xn−j+1R(−1)(x)−x,则答案就是 H(R(x))。由于 H 比较复杂,不好直接导,使用扩展另类拉格朗日反演:
可以直接计算。
NOIP一轮复习:特殊计数数列
斯特林数与有限微积分
定义上升 / 下降阶乘幂:xk_=k∏i=1(x−i+1),x¯k=k∏i=1(x+i−1), 即 xn_=x!(x−n)!,x¯n=(x+n−1)!(x−1)!
普通的幂次 xn 称为方幂,二项式系数 (nm)=nm_m!。
推论:xa+b_=xa_(x−a)b_,x¯a+b=x¯a(x+a)¯b
x¯n=(−1)n(x+n−1)n_。
阶乘加倍公式:xk_(x−12)k_=(2x)2k_22k。
由此可以推导出经典的卡特兰数的生成函数:∞∑n=0(2nn)xn=1√1−4x。
证明:(2nn)=(2n)n_n!=(2n)!(n!)2=4n×nn_(n−12)n_(n!)2=4n(nn−12)=(−4)n(−12n) 下降幂二项式定理:(x+y)n_=n∑k=0(nk)xk_yn−k_。
将两边同时除以 n! 后根据范德蒙德卷积易证。
阶乘幂的差分:(x+1)n_−xn_=nxn−1_
阶乘幂的求和:k−1∑x=0xn_=kn+1_n+1
经典的微积分基于微分算子 Df(x)=limh→0f(x+h)−f(x)h,而有限微积分则基于差分算子 Δ 和下降幂。
- 有限微分:Δ(xn_)=nxn−1_
- 有限定积分:k−1∑x=0xn_=kn+1_n+1
- 调和级数 $\int x^{-1} = \ln x ,∗∗有限积分不变量∗∗:\Delta(2^x) = 2^x$
- 乘法法则:Δ(uv)=uΔv+E(v)Δ(u)
- 分部积分法则:∑uΔv=uv−EvΔu
定义第二类斯特林数 {nm} 表示 n 个有标号物体放进 m 个无标号非空盒子的方案数,递推式为:
{nm}={n−1m−1}+m{n−1m}
组合意义:考虑最后一个小球是否放进一个新盒子里面。
根据定义,我们可以容斥计算出单个 {nm}=1m!m∑k=0(mk)(−1)k(m−k)n ,这与生成函数 [xn](ex−1)m 相同。
第二类斯特林数 - 行的快速计算:根据容斥式卷积即可。
第二类斯特林数 - 列的快速计算:(ex−1)m。
第二类斯特林数建立了方幂和下降幂的关系:
mk=k∑i=0(mi)i!{k i} ,当一些问题要求出某些答案的 k 次方和时,通常使用第二类斯特林数将 k 次方降下来,对于剩下的组合数,可以考虑组合意义递推或直接计算。
例题
例题1:CF932E Team Work
例题2:[国家集训队] Crash 的文明世界
n∑i=1dist(x,i)k=n∑i=1k∑j=0{ki}i!(dist(x,i)j)=k∑j=0{kj}j!n∑i=1(dist(x,i)j)
设 fi,j 表示距离以 i 为根时,j 的 n∑i=1(dist(x,i)j) ,转移直接 fx,i←fy,i+fy,i−1+fx,i。
对于多个 x, 换根 dp 即可。
例题3:CF1097G Vladislav and a Great Legend
转化后,变成对于每一个 i∈[1,k],计算所有虚树中选出 i 个点的方案数。
同样考虑 dp ,设 fx,i 表示以 x 为根的子树中选出 i 条边的方案数 ,在最浅处统计答案,转移就是个背包。
定义第一类斯特林数 [nm] 为把 n 个有标号球放进 m 个非空圆排列 的方案数,递推式为:
[nm]=[n−1m−1]+(n−1)[n−1m]
组合意义:同样考虑最后一个球的位置,但是放进已有圆排列的方案为 (n−1)
第一类斯特林数没有简洁的求单项的公式,但我们有以下结论:
n∏i=1(x−i+1)=xn_=n∑k=0(−1)n−k[nk]xk
因此,求一行的第一类斯特林数可以直接计算 n−1∏i=0(x−i), 可以分治做到 O(nlogn)
求一列的第一类斯特林数,直接计算 (−ln(1−x)−1)k
例题5:CF960G Bandit Blues
考虑根据最大值划分成一个前缀和一个后缀,设 fi,j 表示 i 个数,不同的前缀最大值 j 个的方案,从大往小加入,可得 fi,j=fi−1,j−1+(i−1)fi−1,j,发现就是第一类斯特林数的递推公式,最后答案为:
ans=n∑i=1(n−1i−1)[i−1a−1][n−ib−1]
考虑组合意义:可以看做总共有 a+b−2 个圆排列,选出 a−1 个,最后答案就是:[n−1a+b−2](a+b−2a−1)
斯特林反演
方幂,上升 / 下降幂的转化:
- 方幂转下降幂:xn=n∑k=0{n k}xk_
- 下降幂转方幂:xn_=n∑k=0(−1)n−k[nk]xk
- 方幂转上升幂:xn=n∑k=0(−1)n−k{nk}x¯k
- 上升幂转方幂:x¯n=n∑k=0[nk]xk
由此,我们可以得出:xn=n∑k=0{nk}xk_=n∑k=0{nk}k∑i=0[ki](−1)k−ixi
=n∑i=0xin∑k=i{nk}(−1)k−i[ki]
得到斯特林判别式:[n=m]=n∑i=m{ni}[im](−1)i−m
从矩阵乘法的角度来看,令 An,m={nm}(−1)m,Bn,m=[nm](−1)m,则有 AB=I
把上面的 xn 代换成 f(x),xn_ 代换成 g(x), 就可以得到斯特林反演的四种形式,只列举两种:
- 若 f(n)=n∑k=0{nk}g(k)⇒g(n)=n∑k=0[nk](−1)n−kf(k)
- 若 f(n)=∑k≥n{kn}g(k)⇒g(n)=∑k≥n[nk](−1)k−nf(k)
例题
例题1:BSOJ5711 异或图
首先把连通容斥掉,设 fn 表示恰好有 n 个连通块图的个数,gn 表示至少有 n 个连通块图的个数,那么有 :gm=∑n≥m{nm}fn ,根据斯特林反演得:f1=∑n≥1(−1)n−1[n1]gn=∑n≥1(−1)n−1(n−1)!gn。
由于 n≤10, 我们可以暴力枚举每个点的连通情况(与哪些点连通)。
根据一般容斥的套路,我们钦定不在同一个连通块的点强制不连通,而在同一个的可以随便连边。
对于每一个图的选择方案和两个强制钦定不在同一个连通块的点构成了一个异或方程组,这个方程解的数量就是符合条件的图的集合。
而方程组解的个数显然为消元后自由元的个数,直接高斯消元即可。
时间复杂度 O(Belln×n3), 其中 Belln 表示贝尔数第 n 项。
例题2:【2018雅礼集训1-16】方阵
设 fk 表示只考虑前 k 行的合法的填数方案,随便填的方案为 (m!)k_, 考虑容斥掉重复的答案。
发现我们可以把所有重复的行看作一个等价类,也就是一个集合,于是就可以用斯特林反演:fk=(m!)k_−k−1∑i=1fi{ki}。
本文作者:henrici3106
本文链接:https://www.cnblogs.com/henrici3106/p/16747830.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步