加载中...

ABC 462 G (容斥原理,NTT,多项式的启发式合并)

G - Completely Wrong

Q:给定两个长度为 \(n\) 的序列 \(C, G\),元素值域为 \([1, n]\),求满足对于 \(\forall i \in [1, n], C_{p_{i}} \neq G_{i}\) 的长度为 \(n\) 的排列 \(p\) 个数(即错排)。

如果 \(C, G\) 均为 \(1 \backsim n\) 的排列,那么方案数显然为 \(n\) 的错排数。而分析错排问题的一个经典思想便是利用容斥原理:考虑计算存在某个位置满足 \(C_{p_{i}}\)\(G_{i}\) 匹配的方案数 \(cnt\),那么答案便为 \(n! - cnt\)

计算 \(cnt\):我们钦定其中 \(t\) 个位置的 \(G_{i}\) 一定匹配,剩下的 \(n - t\) 个位置的情况任意(可以匹配,也可以不匹配);当 \(t\) 为奇数时加到总贡献中,为偶数时减。于是 \(cnt\) 可以表示为:

\[\sum_{A\subset \{ 1,2,...,n\} 且 A \neq \phi} (-1)^{|A|-1} \times (钦定集合 A 内的所有位置匹配的方案数) \]

若不按最基本的容斥原理角度(划分子集)考虑,而是按照匹配位置个数考虑,可以表示为:

\[\sum_{t > 0} (-1)^{t-1} * P_{t} * (n - t)! \]

其中 \(P_{t}\) 表示钦定 \(t\) 个位置匹配的总方案数。

考虑如何计算 \(P_{t}\):将不同颜色组合起来。对于每一种颜色,单独计算它强制命中 \(t\) 个位置时的方案数,然后用乘法原理整合。

容易发现,可以利用卷积来进行对于不同颜色的整合。因此我们将每一种颜色 \(a\),将颜色 \(a\) 强制命中 \(t\) 个位置的方案数作为多项式中 \(x_{t}\) 的系数

对于颜色 \(a\),有多项式:

\[P_{a}(x) = \sum_{t=0}^{\min(cntC_{a}, cntG_{a})} [C_{cntC_{a}}^{t} * C_{cntG_{a}}^{t} * t!] * x^{t} \]

于是按照乘法原理,将所有颜色的多项式作卷积,得到:

\[P(x) = \prod_{颜色a} P_{a}(x) \]

\(P_{t}\) 即为 \(P(x)\)\(x^{t}\) 的系数。

分析复杂度瓶颈:由于最多有 \(n\) 种颜色,因此我们最多需要对 \(n\) 个多项式作卷积(也就是做 \(O(n)\) 次多项式乘法);而 NTT 优化多项式乘法的复杂度为 \(O(n\log n)\),故总复杂度看似是 \(O(n^{2}\log n)\)。但是我们需要发现一个重要性质:所有颜色出现的总次数固定为 \(n\),因此所有多项式的次数总和(即项数)恰好为 \(n\) 于是,我们考虑用启发式合并思想优化卷积:每次选取当前项数最少的两个多项式作卷积,不断进行该过程直到只剩下一个多项式。这个与若干堆石子的启发式合并是完全等价的,每颗石子参与合并后所在集合大小至少是原来的 \(2\) 倍,故每颗石子最多参与 \(O(\log n)\) 次合并(\(n\) 表示石子总数),总复杂度为 \(O(n \log n)\)

这里总复杂度会被优化至 \(O(n \log^{2} n)\)

code

posted @ 2026-06-29 21:57  小橘奏  阅读(17)  评论(0)    收藏  举报