容斥
NOI2025 集合
看不懂 B 性质咋办,那得推式子才知道。枚举 \(f(P)=f(Q)=S\),并容斥钦定其满足条件。即
进行一个式子的推。不妨枚举 \(T1\cup T2=T\),即
然后这个时候就初见端倪,因为分母上出现了 \(a+1\),这下看懂了.png。不急,我们先做 B 性质。不妨设 \(w_S=(-1)^{|S|}\prod_{S\subseteq T}(1+a_T)\),这个可以高维后缀积做出来。
然后这个时候我们已经愉快地做到了 \(\Theta(3^nn)\),不过给的分非常少,因为还依赖 B 性质。考虑交换 \(S,T\) 求和顺序。
考察任意一对 \(T_1,T_2\) 会对什么产生贡献。很显然它会对 \(2^{|T_1\cap T_2|}\) 个 \(S\) 产生贡献。所以没有必要枚举 \(S\)。
然而很天才的事情是 \(|T_1\cap T_2|+|T_1\cup T_2|=|T_1|+|T_2|\),所以我们发现 \(|T_1\cap T_2|=|T_1|+|T_2|-|T_1\cup T_2|=|T_1|+|T_2|-|T|\)。于是
对,但是现在我们发现后半部分是没有任何限制的或运算卷积,可以 \(\Theta(n2^n)\) 做一下。前半部分也是高维后缀积。所以现在整个 B 性质全部可以通过,拼上暴力可以获得 \(56\sim 68\) 分。
那咋办。感觉上你要做到这个避免除以 \(0\) 的唯一方法就是记有几个 \(0\) 在因子里:换种说法,我要表达的意思是,把 \(0\) 看做一个元 \(x\) 这样。然后我们要做的就是求一个 \(\lim\limits_{x\to 0} \dfrac{F(x)}{G(x)}\)。因为 \(G\) 此时是一个单项式,不妨考查 \(F(x)\) 的最低次项。如果 \(F\) 的最低次项 \(> G\) 的,则答案为 \(0\);否则答案为 \(F\) 与 \(G\) 最低次项系数的比。
我们可以证明 \(F\) 的最低此项不会 \(<G\) 即极限无意义,因为 \(w_T\) 的次数在每一维上都是不增的,所以取 \(T_1=T_2=T\) 时带来的次数最小,发现此时其次数也已经 \(=\deg G\)。
所以对做法进行改编:我们维护每个点的最低次项次数,FMT 时是极好合并的。
复杂度 \(\Theta(n2^n)\),可以通过。
PA 2019 Final 数图
先瞎刻画刻画,就是这个有两个长为 \(n\) 的序列 \(a,b\),要求 \(a_i\neq i,b_i\neq i,a_i\neq b_i\),且 \(1\sim n\) 在里面都出现了恰好 \(2\) 次,方案数除以 \(2^n\) 就是要的答案。
呃,那就容斥,钦定 \(x\) 个 \(a_i=b_i\),\(y\) 个 \(a_i\neq i\) 或 \(b_i\neq i\),\(z\) 个都满足。那么容斥系数会是 \((-1)^{x+y-z}\)。考虑其方案数。
首先算 \(x-z\) 这些位置的方案数。就是 \(n-y\) 个数里面,选出 \(x-z\) 个数填进去,每个位置都不是 \(i\)。假设 \(n\) 个数选 \(m\) 个数使得每个位置都不是 \(i\) 的方案数是 \(f_{n,m}\)。那么容斥可以得到
所以这些位置的贡献是 \(f_{x-z,n-y}\)。然后考虑 \(y-z\) 这些数要钦定是 \(a\) 还是 \(b\) 不满足条件,带来 \(2^{y-z}\) 的贡献。剩下的还有 \(y-z\) 个数和 \(2(n-x-y+z)\) 个数没有填;不妨假设还没填的数两两不同,最后再将系数除以被算多的 \(2^{n-x-y+z}\)。前半部分的贡献是 \(f_{2(n-x-y+z)+y-z,y-z}\),后半部分是 \((2(n-x-y+z))!\)。乘在一起即可。还要记得算钦定位置对应的系数,是平凡的。复杂度三次方。
清华集训 2014 主旋律
太经典了。
考虑用枚举一些东西得到的式子表示总方案数 \(2^m\)。然后会得到
意思是,枚举入度为 \(0\) 的强连通分量个数 \(i\),钦定有 \(i\) 个(注意这里是钦定,所以我们事实上需要使用容斥系数 \(F(i)\) 将每个 \(i\) 得到它应得的系数)。\(g_{S,i}\) 是 \(S\) 内选边方案使得它是 \(i\) 个强连通分量的方案数。
考虑对于一种实际情况有 \(x\) 个入度为 \(0\) 的强连通分量;那么我们希望它的贡献是 \(1\)。并且对于 \(i\le x\) 都会统计它,被统计 \(\dbinom xi\) 次。于是
可以推得 \(F(i)=(-1)^{i+1}\)。然后你考虑把 \(i=1,S=U\) 单独分离出来就可以得到答案。\(g_{S,i}\) 的贡献是可以拆掉的,只要把 \(-1\) 的系数扔进 dp 就行了。精细实现可以 \(\Theta(3^n)\) 但是我不想实现。
联合省选 2025 岁月
[某知名选手]:感谢你,所有在 D2T2 放非多项式复杂度题目的出题人。愿你们的妈妈在天堂相遇。
好吧,我们假设沿用了主旋律的做法,现在这个 C 性质就是要我们求这个图入度为 \(0\) 的强连通分量恰有一个的方案数。
也就是,仍考虑枚举 \(i,S\):
对于一种合法方案,假设有 \(x\) 个入度为 \(0\) 的强联通分量:会被计算 \(\dbinom xi\) 次。这次我们希望
于是我们可以得到,\(F(i)=i(-1)^{i+1}\)。看起来完全正确!
但是这样我们怎么沿用之前的做法做到 \(3^n\) 呢?你发现,呃,就是这个 \(-1\) 的贡献就没办法简单地拆开了,那咋办。
考虑令
考虑 \(g_{S,i}\) 的定义,然后把式子带进去拆开就行。发现也可以优化掉。
「KDOI-11」彩灯晚会
首先把所有点重标号使得 \(1\sim n\) 是一个拓扑序,使用拓扑排序完成。
平方的组合意义太典了啊,那就等价于你选定两条长为 \(l\) 的路径,钦定它们颜色相同。假设一个路径的点集为 \(X\) 另一个为 \(Y\)。产生的贡献是
其中
观察最难处理的限制:并集的大小。我一开始对并集做容斥,得到了并非有前途的做法。既然“并非”有前途,不妨尝试对交集做容斥。我们有 \(|X\cup Y|=2l-|X\cap Y|\)。不妨枚举 \(S=X\cap Y\),并容斥钦定 \(S\subseteq T\) 使得 \(T\) 成为 \(|X\cap Y|\) 的子集。
其实这个时候看起来就好做了,为什么呢?考虑确定一个 \(T\),那么 \(X,Y\) 的元素事实上会被 \(T\) 分成若干个区间;那么我们对一个区间处理出 \(f_{l,r,i}\) 表示选定 \(l, r\),中间额外选了 \(i\) 个元素的所有合法 \(S\) 的 \(W(S)\) 之和,这个可以 \(\Theta(n^3l)\) 处理出来;再进行 dp,即 \(g_{i,x,y}\) 表示考虑了 \(1\sim i\) 并钦定 \(i\in T\),此时 \(|X|\cap [1,i]=x,|Y|\cap [1,i]=y\) 的贡献之和。
暴力转移需要枚举 \(j\) 表示 \(i\) 在 \(T\) 中的前驱,以及 \([j,i]\) 段 \(X\) 和 \(Y\) 选了几个,做形如二维卷积的转移。复杂度 \(\Theta(n^2l^4)\),可以获得随机分数,总之无法获得满分。
考虑直接分步卷积,先卷第一维再卷第二维即可,因为贡献系数是可拆的。复杂度 \(\Theta(n^2l^3)\),可以获得 \([88,100]\) 分,因为卡常大概率没办法获得满分。。
DFS Order 4
太帅了。
如果你在做一个计数题,不妨先考虑判定一个主体是否合法。对于一个 dfs 序,我们可以这样反着构建一棵树:维护“当前点”,如果要加入的点编号大于当前点,则直接挂为儿子,并挪上去;否则往上跳到分界点,以分界点上边为兄弟(即挂在其父亲下)。那么计数的主体变为:能被构建出来的树方案数。
首先考虑这些树满足什么性质:对于一个不是其父亲的第一个儿子的点,其必然需要小于其上一个兄弟的最后一个儿子的编号。如果其大于,那么肯定不会被挂在这里。如果最后一个儿子不存在呢?可以证明,不存在这种情况;即,所有叶子都是以父亲的最后一个儿子形式出现的,同样不难证明。
对于两棵不同的树,有可能形态不同,也有可能标号不同,考虑固定其形态,计算其标号方案。其形态要求即所有叶子都是父亲的最后一个儿子。标号呢?在有被钦定大小关系的点之间连边,大的连向小的;现在我们得到了类似于 dag 拓扑序计数的东西。
。事实上我们可以删掉很多边。因为如果一个点不是其父亲的第一个儿子,则他到父亲的边是不必要的,因为我们已经钦定了它大于上一个儿子,而第一个儿子大于父亲。这等价于我们用类似于左儿子右兄弟的方式表达了这棵树,不过这无所谓,关键的在于如何处理那些“小于其上一个兄弟的最后一个儿子的编号”的限制。
我们很幸运,因为有一些很奇妙的观察:你选中这些限制边的任意子集,不在子集中的边先扔掉,在子集里的保留并反向,然后再扔掉一些无用的原有限制边,那么你会得到一棵树!而树的拓扑序是好计算的,即 \(n!\prod \dfrac{1}{siz!}\)。
假设这棵树形态固定,于是我们钦定容斥。那么容斥系数必然是 \((-1)^{|S|}\)。感性很容易理解,理性分析即对于任意一种有 \(k\) 条不满足的方案,会被计入 \(\sum_{i=0}^k \dbinom ki F_i\) 次,解得 \(F_i=(-1)^i\)。继续观察发现,我们可以将上面保留内向树的过程简化为:保留每个点第一个儿子到自己的限制,而对每个非其父亲第一个儿子的点,以 \(1\) 的系数连它到它上一个兄弟的边,以 \(-1\) 的系数连它到它上一个兄弟最后一个儿子的边。
直接对原问题做 dp:\(f_{i,j}\) 表示,当前有一棵树大小为 \(i\),其右侧有一棵树大小为 \(j\),\(j\) 需要选择连 \(i\) 或者 \(i\) 的最后一个儿子,容斥系数及贡献之和(不计算 \(j\) 内的系数);令 \(g_{i,j}\) 表示,当前有若干棵树,大小和为 \(i\),在最后一棵树的根上挂了一棵大小为 \(j\) 的树(这里的“挂”指的是,这棵 \(j\) 树在原树上和 \(i\) 同地位,而被钦定限制的外向树连上 \(i\)),容斥系数及贡献之和(不计算 \(j\) 内的系数)。转移是简单的,做到小常数三次方。
P10004 [集训队互测 2023] Permutation Counting 2
喜提最劣解。
考虑钦定原排列 \(i\) 个位置 \(<\),则等价于把排列划分为 \(n-i\) 条链。那么从小到大填数:每个数选择一条链,得到一个长为 \(n\) 值域为 \([1,n-i]\) 的序列 \(s\),要求 \([1,n-i]\) 都在里面至少出现一次。对所有 \(j\) 计算 \(\sum [s_i\le s_{i+1}]=j\) 的 \(s\) 个数。
假设上述答案记为 \(f_{i,j}\),则有 \(f_{i,j}=\sum_{l=j}^{n-1} \binom {l}{j} ans_{l,j}\),可以二项式反演出来 \(ans_{i,j}\)。考虑算出 \(f_{i,j}\)。
即我们要对所有 \(i,j\) 算长为 \(n\) 值域为 \(i\) 非严格上升对数为 \(j\),且 \([1,i]\) 内数全部出现的 \(s\) 个数。考虑先容斥掉全部出现的限制,发现转化后形式相同。现在对所有 \(i,j\) 算长为 \(n\) 值域为 \(i\) 非严格上升对数为 \(j\) 的 \(s\) 个数。
继续改为钦定 \(q\) 个位置是非严格上升的,最后继续二项式反演回来;枚举值域 \(v\),假设划分成了长度为 \(w_1,w_2,\dots,w_{n-q}\) 的若干段,则方案数为
令 \(k=n-q\)。考虑直接上生成函数,一段的生成函数为:
所以 \(k\) 段应该是
则
考虑预处理出 \(i\in [0,n^2)\) 的所有 \(\dbinom{i+n}n\),这个是简单的;那么我们可以三次方计算所有 \((v,q)\) 形如“值域为 \(v\) 长为 \(n\),钦定了 \(q\) 个非严格上升对”的序列个数。
于是我们也可以二项式反演回来,得到“值域为 \(v\) 长为 \(n\),恰好有 \(q\) 个非严格上升对”的序列个数。
于是我们也可以二项式反演回来,得到“值域为 \(v\) 长为 \(n\),保证 \([1,v]\) 都至少出现一次,恰好有 \(q\) 个非严格上升对”的序列个数。
于是我们也可以二项式反演回来,得到原问题的答案。
每次二项式反演都是三次方的,所以就做完了。
写完发现要跑 15s,就嗯卡常,然后上了个 barrett,以 4.87s 极限通过。

浙公网安备 33010602011771号