USACO US Open 2020 T2: Exercise

首先,一个排列对应的权值为其中所有循环长度的最小公倍数(\(\operatorname{lcm}\))。

那么对每个质因数分别考虑:如某个 \(p^x \le N\),我们希望统计 \(p^x\) 对答案贡献了多少个幂次。

例如当 \(N = 5\) 时样例解释给出了 \([1, 25, 20, 30, 24, 20]\)

所以 \(2^1\) 贡献了 \(25 + 20 = 45\) 次,\(2^2\) 贡献了 \(30\) 次,\(3^1\) 贡献了 \(20 + 20 = 40\) 次,\(5^1\) 贡献了 \(24\) 次。

答案就是 \(2^{45} \cdot 4^{30} \cdot 3^{40} \cdot 5^{24}\),容易验证是正确的。

我们发现这样还是有点怪,因为统计的是“恰好”,例如 \(2^2\) 是无法贡献给 \(2^1\) 的。

所以我们这样考虑:如果 \(\operatorname{lcm}\) 质因数分解中的一项为 \(p^x\),则会给所有 \(p^y\)\(1 \le y \le x\))都贡献一次。

也就是现在统计的是 \(\operatorname{lcm}\) 中的 \(p\) 的幂次超过(而不是恰好等于)\(x\) 的排列的个数。

那么现在 \(2^1\) 贡献了 \(25 + 30 + 20 = 75\) 次,而 \(2^2\) 贡献了 \(30\) 次。

但是现在算贡献,因为改变了统计的东西,所以是 \(2^{75} \cdot 2^{30} \cdot 3^{40} \cdot 5^{24}\)(注意是 \(2^{30}\) 而不是原先的 \(4^{30}\))。

综上,我们现在计算的目标是

\[\begin{aligned} \mathbf{Ans} &= \prod_{A \in S_{[N]}} \operatorname{step}(A) \\ &= \prod_{ \begin{subarray}{c} p \in \mathbb{P} \\ p \le N \end{subarray} } \exp_p \sum_{p^x \le N} \sum_{A \in S_{[N]}} [p^x \mid \operatorname{step}(A)] \end{aligned} \]

也就是对于每个 \(p^x \le n\) 计算循环长度 \(\operatorname{lcm}\)\(p^x\) 的倍数的排列个数,然后计算 \(p\) 的那么多次方再相乘。

循环长度 \(\operatorname{lcm}\) 要是 \(p^x\) 的倍数,则其中至少有一个循环的长度是 \(p^x\) 的倍数。

容斥,转化为所有排列的个数减去每个循环长度都不是 \(p^x\) 的倍数的排列个数。

所有排列的个数即为 \(N!\),而每个循环长度都不是 \(p^x\) 的倍数,就是强制不选长度为 \(p^x\) 的倍数的循环的有序组合。

如果你没看懂前一句话的后半部分,这时就是生成函数出场的时候了。为了方便表示,令 \(k = p^x\)

我们知道一个排列就是若干个循环的有序组合(循环也就是圆排列)。所以应该有此式:

\[\exp \mathbf{EGF}(\textrm{cyclic permutation}) = \mathbf{EGF}(\textrm{permutation}) \]

事实上这确实是成立的,因为

\[\begin{aligned} \mathbf{EGF}(\textrm{permutation}) &= \sum_{i = 0}^{\infty} \frac{i!}{i!} z^i \\ &= \frac{1}{1 - z} \\ \mathbf{EGF}(\textrm{cyclic permutation}) &= \sum_{i = 1}^{\infty} \frac{(i - 1)!}{i!} z^i \\ &= \sum_{i = 1}^{\infty} \frac{z^i}{i} \\ &= \ln \frac{1}{1 - z} \end{aligned} \]

那么每个循环长度都不是 \(k = p^x\) 的倍数的排列个数,应该是去除长度为 \(k\) 的倍数的圆排列的有序组合。

\[\begin{aligned} \mathbf{EGF}(\textrm{required sequence}_k) &= \exp \left[ \sum_{i = 1}^{\infty} \frac{z^i}{i} - \sum_{i = 1}^{\infty} \frac{z^{i k}}{i k} \right] \\ &= \frac{1}{1 - z} \div \exp \frac{1}{k} \ln \frac{1}{1 - z^k} \\ &= \frac{1}{1 - z} \div {\left( \frac{1}{1 - z^k} \right)}^{1 / k} \\ &= \frac{{(1 - z^k)}^{1 / k}}{1 - z} \end{aligned} \]

而我们要求的就是 \(\textrm{required sequence}_k\) 的第 \(N\) 项系数,也就是 \(\displaystyle N! [z^N] \frac{{(1 - z^k)}^{1 / k}}{1 - z}\)

注意到 \({(1 - z^k)}^{1 / k}\) 只有在 \(k\) 的倍数次项有值,而 \(\displaystyle \frac{1}{1 - z}\) 实际上是一个前缀和操作,所以做如下变换:

\(l = \lfloor N / k \rfloor\),要求的即是(这一步由 EntropyIncreaser 提供)

\[\begin{aligned} N! [z^N] \frac{{(1 - z^k)}^{1 / k}}{1 - z} &= N! [z^{l k}] \frac{{(1 - z^k)}^{1 / k}}{1 - z} \\ &= N! [z^{l k}] \frac{{(1 - z^k)}^{1 / k}}{1 - z^k} \\ &= N! [z^{l k}] {(1 - z^k)}^{1 / k - 1} \\ &= N! {(-1)}^l \binom{1 / k - 1}{l} \\ &= N! \binom{l - 1 / k}{l} \end{aligned} \]

那么最终结果也就是 \(\displaystyle N! - N! \binom{l - 1 / k}{l}\)

然而组合数的上指标不是整数(因为位置在指数上,要对 \(M - 1\) 取模,必须避免除法)必须进一步化简:

\[\begin{align*} N! \binom{l - 1 / k}{l} &= \frac{N!}{l!} \prod_{i = 1}^{l} (i - 1 / k) \\ &= \frac{N!}{k^l l!} \prod_{i = 1}^l (i k - 1) \tag{2} \\ &= \frac{1 \times 2 \times \cdots \times N}{k \times 2 k \times \cdots \times l k} \prod_{i = 1}^l (i k - 1) \\ &= N^{\underline{N - lk}} \times \prod_{i = 1}^{l} (i k - 1) {(i k - 1)}^{\underline{k - 1}} \end{align*} \]

至此,就化为了只有乘法而没有除法的式子了。而且其中涉及的数的范围都在 \([1, N]\) 内。

可以发现每个要求的值都是下降幂形式,通过一些方式预处理下降幂即可。

例如如果暴力预处理所有可能的下降幂,或者用暴力预处理组合数乘阶乘的方式,复杂度为 \(\mathcal O (N^2)\)

如果使用猫树预处理,复杂度为 \(\mathcal O (N \log N)\)

如果对 \(M - 1\) 分解质因数并预处理阶乘在每个质因数上的幂次,也可以做到单次询问 \(\mathcal O (\omega(M - 1))\)
(此时直接对 \((2)\) 式进行计算即可,对于每个 \(k\) 需要花费 \(\mathcal O (l + \omega(M - 1))\) 的时间)

总之不论使用何种预处理方式,最后答案的表达式就是:

\[\begin{aligned}\mathbf{Ans} &= \prod_{ \begin{subarray}{c} p \in \mathbb{P} \\ p \le N \end{subarray} } \exp_p \sum_{p^x \le N} \sum_{A \in S_{[N]}} [p^x \mid \operatorname{step}(A)] \\&= \prod_{ \begin{subarray}{c} p \in \mathbb{P} \\ p \le N \end{subarray} } \exp_p \sum_{ \begin{subarray}{c} k = p^x \le N \\ l = \lfloor N / k \rfloor \end{subarray} } \left[ N! - \frac{N!}{k^l l!} \prod_{i = 1}^l (i k - 1) \right] \\&= \prod_{ \begin{subarray}{c} p \in \mathbb{P} \\ p \le N \end{subarray} } \exp_p \sum_{ \begin{subarray}{c} k = p^x \le N \\ l = \lfloor N / k \rfloor \end{subarray} } \left[ N! - N^{\underline{N - lk}} \times \prod_{i = 1}^{l} (i k - 1) {(i k - 1)}^{\underline{k - 1}} \right]\end{aligned} \]

然后使用你喜欢的预处理方式计算下降幂,最后再用快速幂计算答案即可。

预处理复杂度在 \(\mathcal O (N \log \log N)\)\(\mathcal O (N^2)\) 不等,计算复杂度为 \(\displaystyle \mathcal O \left( N \log \log N + \frac{N \log M}{\log N} \right)\)

posted @ 2020-03-31 16:18  粉兔  阅读(737)  评论(0编辑  收藏  举报