常见数列
贝尔数:n 个数分成若干个非空集合的方案数
- Bn=∑k=0nS(n,k)。
- 递推:Bn=∑k=0n−1(kn−1)Bk。
调和级数:Hn=∑i=1ni1=lnn+εn+γ,其中γ是欧拉常数,εn≈2n1。
容斥原理
ARC 102 E
有 n 个不可取分的 k 面骰子,对于每个i=2,3,⋯,2K,求有多少种方案使得:任意两个骰子朝上的面要么相同,要么和不为i。答案对998244353取模。
2≤n≤2000,1≤k≤2000。
先枚举i。也就是说1,i−1,2,i−2,……不能同时出现。那么就出现 0 次或者一次。直接枚举有多少组里出现了一个。假设有j组。设这j个有2j种选择(左边或者右边)。然后考虑出现了多少次:x1+x2+⋯+xj,其中xi>0。然后枚举yi表示比i大的数字出现的次数。把x,y放在一起插版即可。
集训队作业 2018 小 z 的礼物
设tx表示 x 这个礼物第一次得到的时间。要求E(maxtx)。考虑容斥。
T∈S∑(−1)∣T∣+1E(x∈Tmintx)
T定下来:直接算随到一个的概率。假设有X个 pair 满足,一共有Y个 pair。那么期望就是E(minT)=XY。
考虑 DP。f(i,j,S,x)表示现在考虑第i行第j个格子,S表示每行最后一个元素选不选。考虑x是否在子集中。
ARC 96 E Everything on It
题意:求有多少个子集族满足:
- 其中任意一个子集都是[n]的子集;
- 任意两个子集不同;
- 1,2,⋯,n都在其中出现至少两次。
考虑容斥。枚举i表示1,2,⋯,i出现次数小于等于1。那么答案为
i∑(in)(−1)iF(i)
其中F(i)表示1,⋯i出现次数小于等于 1 的方案数。
考虑枚举有k个集合含有[1,i]中至少一个,其他集合则不含有[1,i]。
显然不含有[1,i]的子集族数为22n−i。
对于这个k个集合,我们考虑把1,⋯,i分入k个集合,有的数字可以不放,每个数字最多出现一次。相当于再拿一个集合出来装垃圾。我们给垃圾堆强制加入数字0来保证每个集合非空。同时我们认为0所在的集合指向垃圾堆。这样就相当于是i+1个数分成k+1个非空集合,那么方案数就是S(i+1,k+1)。
至于这k个集合的其他数字则可以任意填,并且由于k个集合各种含有不同的1,⋯,i的数字,因此其他部分就不需要考虑重复的问题了,那么方案数就是(2n−i)k。
因此得到
F(i)=22n−ik∑(2n−i)kS(i+1,k+1)
ARC 101 E Ribbons on Tree
题意:给你一个 n 个点的数,其中 n 是偶数。问有多少种将n个点配成n/2对的方式,使得每对点的路径并覆盖了整棵树。n≤5000。
不合法的情况就是某条边不被经过,相当于这条边被割掉。因此考虑容斥。暴力的做法是枚举被割掉的边集,然后每个连通块内无限制连边的方案数,复杂度O(2n)。
首先考虑无限制连边的方案数。对于一个大小为x的连通块,它的配对方案数是
g(x)={(x−1)(x−3)⋯10x≡0mod2x≡1mod2
那么考虑 DP 计算容斥贡献。设f(i,j,0/1)表示i的子树中,i所在连通块大小为j,被割的边数的奇偶性为x的配对方案数。注意,我们只统计被割掉的连通块的配对方案数,i所在的连通块暂不统计配对方案数。
假设1是根,我们要求的答案显然是
i=1∑ng(i)(f(1,i,0)−f(1,i,1))
考虑转移,对于(u→v)的边:
- 不割。相当于把v所在的连通块接在u所在的连通块上。则f(u,i)和f(v,j)可以贡献到f′(u,i+j)上。
- 割。则f(u,i)和f(v,j)g(j)贡献到f′(u,i)上。
对子树大小取 min,时间复杂度O(n2)。
ARC 93 F
枚举{G1,G2,⋯,gn}的子集。要求S中的所有集合都满足最小值在A中,问方案数。记作f(S)。答案就是∑S(−1)∣S∣f(S)。
从大到小考虑 A 中的元素。dp(T)表示T的最小值属于 A。
斯特林反演
下降幂:nm=∏i=0m−1(n−i)。
通常幂转下降幂:xn=∑k=0nS(n,k)xk。
上升幂:nm=∏i=0m−1(n+i)。
上升幂转通常幂:xn=∑k=0ns(n,k)xk。
反演公式
斯特林反演:
f(n)=k=0∑nS(n,k)g(k)g(n)=k=0∑n(−1)n−ks(n,k)f(k)
反转公式
k=m∑n(−1)n−ks(n,k)S(k,m)=[m=n]k=m∑n(−1)n−kS(n,k)s(k,m)=[m=n]
引理:
xn=(−1)n(−x)nxn=(−1)n(−x)n
证明显然。
证明反转公式:
nm=k=0∑mS(m,k)nk=k=0∑mS(m,k)(−1)k(−n)k=k=0∑mS(m,k)(−1)kj=0∑ks(k,j)(−n)j=j=0∑mnjk=j∑mS(m,k)s(k,j)(−1)k−j
反之亦然。
证明反演公式:
f(n)=i=0∑n[i=n]f(i)=i=0∑nf(i)j=i∑nS(n,j)s(j,i)(−1)j−i=k=0∑nS(n,k)i=0∑k(−1)k−is(k,i)f(i)
也就是说如果g的定义式成立,那么f成立。
用另一个反转公式,那么如果f的定义式成立,那么g成立。这样就证完了。
2018 雅礼集训 方阵
给定n×m的矩阵,每个格子填上[1,c]中的数字,求任意两行、两列均不同的方案数。
n,m≤5000。
不同:对应位置不同。
考虑只要求行不相同。
设g(m)表示m列的矩阵,行互不相同的方案数。有cm种可能的行。则
g(m)=(cm)n
f(m):m列的答案。枚举g(m)中列被分成多少类。
g(m)=i=0∑mS(m,i)f(i)f(m)=i=0∑m(−1)m−is(m,i)g(i)
注:f(0)=0。
一道例题
给定 n 个结点的树,从某个点出发开始随机游走:在点 u 时,有pu的概率留在原地,否则等概率向相邻结点移动,直到移动到 1 号点停下。求从每个结点出发直指停下,所花费的时间的 k 次方的期望。
n≤105,k≤105,nk≤106。
设u到根结点的期望时间是tu。我们要求E(tuk)。
E(tuk)E((itu))E((itu))(1−Pu)E((itu))=E(i=0∑kS(k,i)tui)=i=0∑kS(k,i)i!E((itu))=PuE((itu+1))+du1−Pu(u,v)∑E((itv+1))=PuE((itu)+(i−1tu))+du1−Pu(u,v)∑E((itv)+(i−1tv+1))=PuE((i−1tu))+du1−Pu(u,v)∑E((itv)+(i−1tv+1))
考虑按照i从小到大的顺序做。设E((itu))=dp(u),E((i−1tu))=au:
dpu=Pu(dpu+au)+du1−Pu(u,v)∑(dpv+av)dpu=1−PuPuau+du1(u,v)∑(dpv+av)
可以按树上高消的套路做了。要记得O(klog2k)预处理斯特林数。
另一道例题
设连通块数为 T:Tk=∑i=0kS(k,i)i!(iT)。问题转化为求出∑T(iT),它表示选出了i个连通块。
设dpt(n)表示 n 个点 t 个连通块的图的个数。
T∑(iT)=j=1∑n(jn)dpi(j)2(2n−j)Ans=i=0∑kS(k,i)i!n!j=1∑ndpi(n−j)(n−j)!j!12(2j)
问题转化为如何求j!dpi(j)。
dpt(n)=i=1∑n(i−1n−1)dp1(i)dpt−1(n−i)(n−1)!dpt(n)=i=1∑n(i−1)!dp1(i)(n−i)!dpt−1(n−i)
那么
G^t=n≥0∑dpt(n)n!xnF^=n≥1∑dp1(n)(n−1)!xn
容易得到
nG^t=F^G^t−1+1
dp1(n)就是lnG(n)。
清华集训 2017 生成树计数
在一个 s 个点的图中,存在 s-n 条边,使图中形成了 n 个连通块,第 i 个连通块中有ai个点。
现在我们需要再连接 n-1 条边,使得该图变成一棵树。对于一种连边方案,设原图中第i个连通块连出了di条边,那么这棵树T的价值为:
val(T)=(i=1∏ndim)(i=1∑ndim)
求出所有可能的生成树的价值之和,对998244353取模。
n≤3×104,m≤30。
转化为 n 个点的生成树 T:
==(i=1∏ndim)(i=1∑ndim)(i=1∏naidi)T∑i=1∑naididi2mj=i∏(ajdjdjm)∑ki=n−2∑(k1,k2,⋯,knn−2)i=1∑naiki+1(ki+1)2mj=i∏(ajkj+1(kj+1)m)
交换
(n−2)!i=1∑n∑ki=n−2∑∏ki!1aiki+1(ki+1)2mj=i∏ajkj+1(kj+1)m(n−2)!i=1∑n∑ki=n−2∑ki!aiki+1(ki+1)2mj=i∏kj!ajkj+1(kj+1)m
EGF
Bi(x)=k≥0∑aik+1(k+1)2mk!xkAi(x)=k≥0∑aik+1(k+1)mk!xk
带回
[xn−2](n−2)!i=1∑nBi(x)i=j∏Aj(x)
定义T(x):
T(x)=∫Ai(x)dx=k≥1∑aikkmk!xk=k≥1∑aikk!xkj=0∑mS(m,k)kj=j=0∑mS(m,j)aijxjeaix
那么复合函数求导得到(sum 里是个复合函数)
Ai(x)=dxdT(x)=j=0∑mS(m,j)aijjxj−1eaix+j=0∑mS(m,j)aij+1xjeaix=eaixj=0∑mS(m,j+1)(j+1)aij+1+S(m,j)aij+1=eaixj=0∑mS(m+1,j+1)aij+1xj
复杂度O(nmlog22n)。
Burnside 引理
ARC 62 F Painting Graphs with AtCoDeer
题意:给出无向图 G,对边染 K 种颜色之一。一个环上面的边旋转后得到的染色方案视为相同,求不同的染色方案数。
求出所有的点双(每个点双是独立的):
- 单独的边:方案数为 K。
- 单环:n1∑d=0n−1kgcd(n,d)。
- 复合环:可以交换两条边的颜色。只用统计不同颜色出现次数的方案数。插板(k−1n+k−1)。
乘起来即可。