ly-容斥杂题选讲
重塑时光[LHSX 2024]
注意到断点是存在插入顺序的,总方案数显然是 \({n+k\choose k}k!n!=(n+k)!\)。
那么计算合法方案数。
一个简单的判断规则是:
- 将每一段缩为一个点,要求这个点内部顺序合法
- 将限制条件连边,要求图是一个 DAG
那么就可以设 \(dp_{i,S}\) 为当前已经加入了 \(i\) 段,使用元素集合为 \(S\) 。
考虑每次新加入一段,但要满足 DAG 的限制。
DAG 容斥:设 \(G(S)\) 为点集 \(S\) 的导出子图。
\[[G(S)\text{is DAG}]=\sum_{T\subseteq{S},T\neq \varnothing,T \text{为独立集,且不存在} S/T \rightarrow T\text{的边}}(-1)^{|T|-1}[G(S/T) \text{is DAG}] \]证明:
若 \(G(S)\) 是 DAG,那么符合要求的 \(T\) 是 \(G(S)\) 中零入度点的非空子集,采取 \((-1)^{|T|-1}\) 的容斥系数有 \(\sum_{i=1}^n{n\choose i}(-1)^{i-1}=0-(-1)^{-1}=1\)
若 \(G(S)\) 不是DAG,那么 \(G(S/T)\) 也不会是 DAG。
以上证明了一个 DAG 图可以由以上方式计算出。
那么我们的问题就两个:满足 DAG 限制,以及段内限制。
设 \(way(S,T)\) 为 \(S\to T\) 的边数,设 \(g_{S}\) 为将 \(S\) 内部排序的合法顺序个数,设 \(f_{S,i}\) 为将 \(S\) 划分为 \(i\) 段,且段落两两间没有边的方案数。
\(g_S\) 是拓扑序计数,而 \(f_{S,i}\) 可以由 \(g_S\) 通过子集 DP 算出。
这边我们采取在 \(f,dp\) 的计算中都不考虑缩点后这些点在序列的相对顺序,最后再来算。
那么在 \(f\) 的计算中,我们每次都取 lowbit 所在的子集进行转移。
根据 DAG 容斥,便有:
这里也没有考虑这些点的相对顺序。
这样就可以做到 \(O(3^nn^2)\)
注意到瓶颈在于 \(dp\) 的转移带有一个卷积,对这一维做插值可以优化到 \(O(3^nn)\)
深搜[NOI2023]
先手玩一下。显然一个方案合法当且仅当存在一个关键点,作为根时不存在横叉边。因此每条边可以独立考虑其影响。
分讨一下,以 \(1\) 为根,设一条非树边 \((x,y),dep_x\ge dep_y\)。
-
\(x\to y\) 不经过 \(1\)
-
\(x,y\) 为祖孙:相当于是将子树 \(y\) 在 \(x\) 方向的儿子 \(v\),将 \(v\) 子树删掉 \(x\) 子树后的所有点 ban 了。
-
\(x,y\) 不为祖孙。
将除了子树 \(x,y\) 的点都 ban 掉
-
-
\(x\to y\) 经过 \(1\)
-
\(x,y\) 为祖孙,也就是 \(y=1\)。
与上个情况一致
-
\(x,y\) 不为祖孙
-
综上所述,相当于只对两个子树没影响,在 dfn 上呈现几个区间。
然后考虑这个问题,显然考虑容斥一下,钦定一个关键点集合都合法,算出这样的答案再容斥可得解。
如何优化?
注意到如果你选了若干的关键点且固定了一些非树边后,你就只能选端点为关键点 LCA 的非树边了,或者是其他子树的返祖边。
方案数的话,就是 2 的可选非树边个数的幂,然后子树外的返祖非树边可以通过换根来球一下。容斥系数就取 \((-1)^{|S|-1}\)。
当将横叉边放在lca 处来处理,相当于将合法的答案栓在了 lca 的两个方向的某两个子树里。
设 \(f_u\) 为仅考虑子树 \(u\) 中的关键点,当选择的关键点所构成的虚树根为 \(u\) 时,方案数与容斥系数的和(这里提前提取一个 \((-1)^{|S|}\),就可以简单乘法合并了),仅考虑被完全包含的特殊边。
那么转移时,由于需要确保是虚树的根,那么就对这个虚树的形态进行dp,设 \(0/1/2/3\) 来表示 \(u\) 在虚树上有几个儿子( \(3\) 指的是至少 \(3\) 个)。
转移是容易的,若这个子树不取,则给出的贡献是 \(2^c\),其中 \(c\) 为在完全该子树内的返祖边(最多延伸到 \(u\)),若取,则该方向儿子因为只能有一个,所以是 \(\sum_{x}f_x2^{p(u,x)}\),其中 \(p(u,x)\) 指的是被这条路完全包含的返祖边条数。
发现拍成 dfn 后可以使用线段树来维护这个 \(\sum\)。
因为以 \(u\) 为虚树根,所以子树内的横叉边一个都不能要。
最后保留 \(2,3\) 的状态为 dp 值。初始化时根据自身是不是关键点,直接在 \(3\) 这个状态初始化。
如果考虑上横叉边,那 \(u\) 在虚树上一定只有两个儿子,且 \(u\) 就是整个虚树根,不能在扩展。
也就是说这部分会直接贡献到答案,为 \(\sum f_xf_y(2^{p(x,y)}-1)2^{others}\),其中 \(p(x,y)\) 为包含在 \(x\to y\) 路径上的横叉边条数。
其中 \(others\) 包含了 \(u\) 树外的横叉边,返祖边,以及其他方向子树的返祖边等等不会影响取 \(x,y\) 的边。而减掉那个 \(1\) 太丑,可以不减,这样就相当于直接将 \(2\) 的答案算了。
至于 \(others\) 处理一下树外的部分,树内的部分,只有 \(u\to x,u\to y\) 的返祖边,这个在上面 dp 时已经用线段树处理出来了,然后还有位于其他子树的返祖边的贡献,可以进行 \(O(son)\) 次线段树区间乘处理。
然后两个方向儿子相乘,会多算一个所有子树的返祖边贡献,除掉即可。
最后,考虑如何加速计算。将整个过程写下,其实横叉边是贡献了 \(x,y\) 各自 \(dfn\) 属于的区间。
钦定 \(dfn_x<dfn_y\),对 \(dfn_x\) 这个限制做扫描线,在 \(dfn_y\) 限制的区间算贡献。
然后答案就以该段区间与前面算过的其他子树(总计一个区间)的和做乘法即可。
因此,我们将横叉边以及 \(2\) 的状态的答案都累计了,再将 \(3\) 的状态累计进答案(要算树外贡献)。
至于树外边数,树内边数,可以做简单树上差分算出。
[CTSC2016] 萨菲克斯·阿瑞
P5417。
首先考虑一个 sa 数组的构造方法,也就是找到 sa 数组与字符串的一种映射。
这就是经典结论了,一个长为 \(n\) 的 sa 数组,唯一对应了一个长为 \(n-1\) 的 01 序列。
设 \(rk_{sa_i}=i\),那么对于 \(sa_i,sa_{i+1}\) 而言,有:
- \(rk_{sa_i+1}<rk_{sa_{i+1}+1}\),则 \(s[sa_i]\le s[sa_{i+1}]\)
- \(rk_{sa_i+1}>rk_{sa_{i+1}+1}\),则 \(s[sa_i]<s[sa_{i+1}]\)
也就是我们可以得到一个 \(s[sa_1],s[sa_2]\dots s[sa_n]\) 中间的 $<,\le $ 的关系。
同理利用这个关系构造出的最小字典序的字符串的 sa 数组可以证明就是这个。
因此充分必要。
01 序列也就是 \(\le,<\) 的意思。我们称一个序列的值,指的是这个序列里 \(1\) 的个数。
考虑计数,则考虑对于每个 sa 数组构造出符合条件的字典序最小的字符串。
显然从小到大尽量填小的即可。
那么问题来了,给定每种字符出现次数,如何求 SA 数组个数?
可以根据 \(<\) 个数来划分情况。
先考虑三个字符的情况,设 \(a,b,c\),如何求得恰有 \(3\) 个 \(<\) 的 SA 数组个数?
根据我们的构造,真实情况下的 \(<\) 可能在SA中会退化表达为 \(\le\)(因为比较不出大小,这下就不是最小字典序的构造了)。
那么就会退化为形如 \(a+b\) 个 A
,\(c\) 个 B
,\(a\) 个 A
,\(b+c\) 个 B
,\(a+b+c\) 个 A
的情况。
方案数就成了:
稍加扩展,可以得到若有 \(c_1\sim c_m\),其实可以通过容斥写作:
因此,考虑 dp。
设 \(f_{i,j,k}\):前 \(i\) 种字符中,共选取了 \(j\) 个字符,现在组合数最后一段的 \(\sum c=k\)。
考虑在开下一段的时候再算上组合数贡献,那么一共有两种转移:
- 加入这一段,字符 \(i\) 至少填入一个(最小字典序构造)。
- 新开一段。
容斥系数怎么解决呢?在不同字符连续填入一段的时候解决吧。
那么在正常情况,都算 \(-1\) 的容斥系数,意味着当前填下这一段后末尾是个 \(<\)。
当填完了该字符的所有个数时,也可以意味着当前填下这一段后末尾是 \(\le\)。
这字符 \(i\) 共有 \(z_i\) 个,那么有转移:
- \(f_{i+1,j+l,0}\leftarrow f_{i,j,k}\frac{1}{(k+l)!},l\in [1,z_i]\)
- \(f_{i+1,j+l,k+l}\leftarrow -f_{i,j,k},l\in [1,z_i]\)
- \(f_{i+1,j+z_i,k+z_i}\leftarrow f_{i,j,k}\)
发现实际上是做斜对角线前缀和,用前缀和优化即可。
\(O(mn^2)\)。
ARC156E
操作可以看做每次选环上不相邻两个数加一。
这边要证明一个充要条件:
序列 \(X\) 合法,当且仅当:
- \(\sum X_i\) 为偶数
- \(\max_{i=0}^{n-1}(X_i+{X_{i+1\bmod n}})\le \frac{\sum X_i}{2}\)
必要性显然,考虑充分性。
对于一张图,由于 \(X_i+X_{i+1\bmod n}\) 不多于总边数,则若存在 \(i\to (i+1)\bmod n\) 的边,则必然存在端点不是 \(i,i+1\bmod n\) 的边,交叉端点即可。
考虑计数。如果存在一个非法的 \(i\) 位置,则最多再存在一个非法位置且位于 \(i\) 旁边。
-
只满足和为偶数的序列 \(X\) 总数。
答案是:
\[\sum_{i=0}^k[i\bmod 2=0][z^i](1+z+\dots+z^{m})^n \]也就是:
\[\begin{aligned} &\sum_{i=0}^k[i\bmod 2=0][z^i](\frac{1-z^{m+1}}{1-z})^n\\ =&\sum_{i=0}^k[i\bmod 2=0][z^i]\frac{1}{(1-z)^n}(1-z^{m+1})^n\\ =&\sum_{i=0}^k[i\bmod 2=0][z^i]\left(\sum_{j=0}^{\infty}{n-1+j\choose j}z^j\right)\left(\sum_{t=0}^{n}{n\choose t}z^{(m+1)t}\right) \end{aligned} \]枚举 \(t\),利用前缀和算 \(j\) 的部分,复杂度 \(O(n)\)。
-
钦定有一个非法位置且和为偶数的 \(X\) 总数。
考虑到此刻必然除掉非法两个数后剩下的数的和不超过 \(2m\),可以先做一个 \(O(nm)\) 的 dp,算出 \(f_{i,j}:\) \(i\) 个数总和为 \(j\) 方案数。
枚举非法位置的和 \(S \in [0,2m]\),答案显然是:
\[n\sum_{S=0}^{\min(2m,K)}f_{2,S}\sum_{T=0}^{\min(S-1,K-S)}f_{n-2,T}[S+T\bmod 2=0] \]前缀和可 \(O(m)\) 计算,dp 预处理 \(O(nm)\)。 \(n\) 是非法位置的取法。
-
有两个非法位置且和为偶数的 \(X\) 总数。
注意到此刻得钦定这三个位置都非法。
枚举剩下 \(n-3\) 个数的和 \(T\),这里以 \(X_1,X_2,X_3\) 作为非法位置。有:
\[\begin{cases} X_1+X_2>T+X_3\\ X_3+X_2>T+X_1\\ X_1+X_2+X_3+T\le K \end{cases} \]得到:
\[\begin{cases} X_1+X_3\le K-T-X_2\\ X_1-X_3<X_2-T\\ X_3-X_1<X_2-T\\ \end{cases} \]也即:
\[|X_1-X_3|< X_2-T,X_1+X_3\le K-T-X_2 \]考虑设 \(g_{i,j}=\sum_{x=0}^m\sum_{y=0}^m[|x-y|<i][x+y\le j]\)
则答案可以表达为:
\[n\sum_{T=0}^{2m}\sum_{X_2=T}^mg_{X_2-T,K-T-X_2} \]\(O(m^2)\)。
岁月[LHSX2025]
这题的困难是体现在代码+思维两方面的。
首先考虑性质 \(C\),相当于求最终留下一张存在最小外向生成树的图的概率。
如何判断一张图存在最小外向生成树?缩点后入度为零的SCC只有一个。
那么考虑主旋律里的做法,可以求出一个 \(f_S\) 为点集 \(S\) 内部的边留下来一个强连通图的概率。
主旋律:算所有情况下的图,最终强连通的方案数。
其核心是利用了:强连通图本质是缩点后只有一个点。
设 \(f_S\) 为最终点集 \(S\) 强连通的方案数,则考虑对零入度点容斥:
钦定一个零入度点强连通分量集合,比如设 \(g_S\) 为将 \(S\) 划分为若干个强连通分量,各自入度为零的方案数。
容斥时,枚举钦定的零入度SCC集合,然后这个集合的点往外连以及不在这个集合的点的连边情况就是任意的。
容斥系数呢?显然对于零入度SCC大小相同的方案,其容斥系数相同。对于一个方案,设其零入度 \(SCC\) 一共有 \(v\) 个,则容斥系数 \(c\) 满足 :\(\sum_{i=1}^v{v\choose i}c_i\)。简单手算前几项可得 \(c_i=(-1)^{i+1}\)。
则令 \(g_S\) 为将 \(S\) 划分为奇数个入度为零的强连通分量的方案数减去划分为偶数个入度为零的强连通分量的方案数。
\[f_S=all(S)-\sum_{T\subseteq S}g_T2^{E(T\to S/T)+E(S/T\to S/T)} \]其中 \(g_S\) 尚未计入 \(f_S\) 的方案数。如此容斥成立。
算出 \(f_S\) 后将其加入 \(g_S\) 的方案中。
\(g\) 的递推也不难:
\[g_S=\sum_{lowbit(T)=lowbit(S),T\subseteq S}-f_Tg_{S/T} \]代码实现时,先转移 \(g\),其中不转移 \(T=S\),然后计算 \(f\),接着将 \(f\) 加入 \(g\)。
在本题中由于算的是概率,可以将无向边视作两条有向边,钦定其存在状态时,每条边乘上 \(2^{-1}\)。所以需要修改上面 \(f\) 的转移系数。
算出 \(f_S\) 后,我们想要算出外向生成树。
则考虑 dp 这个DAG的形态。
枚举DAG中唯一的零入度点组成集合 \(R\),然后做 dp。我们想要求出以某个点集为起点,可以到达全集的概率。
令 \(dp_R=1\) 为初始值,转移时还是通过容斥,用 \(1\) 去减去没有完全可达的概率。
枚举一个不可达点集 \(T\),就有:
\[dp_{S}=1-\sum_{T\subset S,T\cap R= \varnothing}dp_{S/T}2^{-E(S/T\to T)} \]注意到初态 \(R\) 需要枚举,而终态全集,因此考虑倒置这个 \(dp\)。其实也可以理解为逐步收缩。即:
\[dp'_S=-\sum_{T\cap S=\varnothing}dp'_{S\cup T}2^{-E(S\to T)} \]不过值得注意的是,倒置 \(dp\) 后,\(dp_S\) 所代表的实际含义是以 \(S\) 为初态到全集的概率。
将转移看作一条图上的路径,每条路径权值为边权的积,则原 dp 的含义相当于是对于 所有的 \(R\subseteq S\),以 \(S\) 为起点以全集为终点的路径权值求和。
所以对于转置后的dp,再做一个超集和即可。
最后答案的计算,我们忽略了一部分边,也即其余点连回 \(R\) 的边,显然是都不能要的,不然强连通的限制就打破了。
因此 \(R\) 的答案是 \(dp'_Rf_R2^{E(U/R\to R)}\)。
然后考虑一般的情况。根据最小生成树计数的方法,可以看出充要条件就是按边权处理,则在加入边权为 \(w\) 的边之前,整个图的弱连通情况与加入了所有 \(<w\) 的边的弱连通情况相同。
为了方便描述,称 \(G_i\) 为加入了所有边权不大于 \(i\) 的边所构成的图。
由 \(G_{i-1},G_i\),我们可以知道当前层是由哪些小连通块合并在一起成了大连通块。
如果将小连通块视作一个点,每个大连通块分别处理的话,其实和C性质大差不差,就是用边权为 \(i\) 的边将小连通块合起来。
但我们不可能真的只是将其视作一个点,而是要把这个弱连通块的“源点集合” 拿出来作为代表进行 dp。
不妨定义源点的概念:可以到达当前自身所在弱连通块的每一个点。
那么考虑设 \(dp_{i,S}\) 为加入边权 \(\le i\) 的边后,\(S\) 所有点在一个弱连通块里,且作为这个弱连通块的源点集合,可以到达整个弱连通块的概率。
答案显然是 \(\sum dp_{maxw,S}\)。
设 \(stu_{i,S}\) 为在加入边权 \(\le i\) 的边后,集合 \(S\) 里的点所在的弱连通块的并集。
与 C 性质相同,在“主旋律”部分,我们需要重新设置贡献系数,而在“走到全图”的部分,我们需要重新设置系数,并且重设所有情况的概率和。
先看主旋律部分
与C性质不同的是,转移过程中位于同一个小连通块的源点集合是一致的。
那么有如下转移:
在转移 \(g\) 时,分成的两个部分,注意到限制要求源点不能被连入。
有:
\[g_{i,S}=-\sum_{T\subseteq S,lowbit(T)=lowbit(S),stu_{i-1,T}\cap stu_{i-1,S/T}=\varnothing}f_{T}g_{i,S/T}2^{-E(i,T\to stu_{i-1,S/T})-E(i,S/T\to stu_{i-1,T})} \]这里就限制了所有 \(stu_{i-1,S/T}\to T\) 的边都不存在,\(stu_{i-1,T}\to S/T\) 的边不存在。
其他边无所谓,不影响强连通入度零。
在转移 \(f_{i,S}\) 时,依旧要将 \(stu_{i,S}\) 分为两部分,同时两部分的内部边连接情况已经确定,我们只能确定钦定为源点的那部分不能被连入,也就是:
\[f_{i,S}=1-\sum_{T\subseteq S,stu_{i-1,T}\cap stu_{i-1,S/T}=\varnothing}g_{i,S}2^{-E(i,stu_{i-1,S/T}\to T)} \]
再看 DP 部分。
仍然是倒置DP,但贡献系数和“1”都发生了变化。
借助 \(i-1\) 的答案,算出 \(h_S\) 表示 \(stu_{i,S}\) 里所有小连通块的源点集合并集为 \(S\) 的概率。这个可以预处理。
dp 过程中,我们也就是容斥不可达的部分,也就是钦定原本部分的 \(stu_{i-1}\) 不可达另一部分的源点。
有:
\[dp_{S}=h_S-\sum_{T\subseteq S,stu_{i-1,T}\cap stu_{i-1,S/T}=\varnothing}dp_{S/T}h_T2^{-E(i,stu_{i-1,S/T}\to T)} \]转置,这时候需要对每个终结状态设初始值 \(1\),同时最后算的超集和是 \(h_Sdp_S\) 的超集和(\(h_S\) 算一个系数了)。
\(dp_{i,S}\) 作为一个合法的终结状态,当且仅当对于合成 \(stu_{i,S}\) 的每个 \(stu_{i-1}\) 里的连通块都至少有一个点在 \(S\) 里。
最后,枚举新的源点集合时,我们还需要知道连入这个新源点集合 \(S\) 且所属 \(stu_{i-1}\) 不在 \(stu_{i-1,S}\) 里的边是钦定消失的(同性质C的保证源点集合强连通的合法性所必须钦定消失的边)。这个可以简单预处理出来。
最后 \(dp_{i,S}f_{i,S}2^{-cnt(i,S)}\) 就作为 \((i,S)\) 的答案,其中 \(cnt\) 是钦定消失的边。
复杂度的话,每次忽略掉没有连通性变动的点,那就相当于是在做一个枚举子集合并到全集的过程,应该是 \(O(3^n)\) 的,外加总计 \(O(m2^n)\) 的处理。
集合[NOI2025]
写出答案,它是:
不妨设 \(M(P)=\prod_{x\in P}a_x\),则又因 \(P\cap Q=\varnothing\),故可以写为:
本着分离变量的原则,先考虑 \([f(P)=f(Q)]\) 应该如何分离,或者说与 $\cap $ 扯上关系。
相等关系容斥关系式之一:
\[[P=Q]=\sum_{S\subseteq P}\sum_{T\subseteq T}2^{|S\cap T|}(-1)^{|S|+|T|} \]证明:
核心是子集反演。
\[\begin{aligned} [P=Q]&=\sum_{R\subseteq P,R\subseteq Q}[P=R][R=Q]\\ &=\sum_{R\subseteq P\cap Q}(\sum_{R\subseteq S\subseteq P}(-1)^{|S|-|R|})(\sum_{R\subseteq T\subseteq Q}(-1)^{|T|-|R|})\\ &=\sum_{S\subseteq P}\sum_{T\subseteq Q}(-1)^{|S|+|T|-|R|-|R|}\sum_{R\subseteq S\cap T}1\\ &=\sum_{S\subseteq P}\sum_{T\subseteq Q}(-1)^{|S|+|T|}2^{|S\cap T|} \end{aligned} \]这里面涉及到了一些代数技巧,比如凭空演化 \(R\) 利用传递性达到分离参量效果。
还有就是 \([P=R]=\sum_{R\subseteq S\subseteq P}(-1)^{|S|-|R|}\),这里上面写 \(|S|-|P|\) 是一样的。
但是为什么我们要变成二元?这是因为还有一个 \(P\cap Q=\varnothing\) 需要我们考虑,则给 \(P,Q\) 分配一个独立的变元。
设 \(N(S)\) 为 \(S\) 的超集组成的集合。
带入得到:
设 \(f_S=\sum_{S\subseteq T}(a_T+1),g_S=\sum_{S\subseteq T}(2a_T+1)\),则:
计算 \(f,g\) 使用高维后缀积,FMT/FWT 即可。
设 \(h_S=(-2)^{|S|}f_S\),本质上是计算 \(dp=h*h\),其中 \(*\) 是或卷积,使用 FMT/FWT 即可。
最后枚举 \(S\cup T\),利用 \(dp,f,g\) 计算答案即可。
对于 \(a_x+1\) 可能会出现零,考虑将数字维护成 \(x·0^y\) 的形式。
对于加减法?注意到推导过程中的 \(\frac{f_S}{f_{S\cup T}}\frac{f_T}{f_{S\cup T}}\)。这说明 \(h\) 在卷积时的加减法计算,只需要考虑 \(0^y\) 中只对 \(y\) 最小的项进行计算,如果不是,最终必然会有零在最终式子出现。
减法呢,也只需要对 \(y\) 最小的时候做减法即可,必然有 \(y(S\cup T)\ge \max(y(S),y(T))\),也就是高减低不可能发生。