首先,一个排列对应的权值为其中所有循环长度的最小公倍数(\(\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)\)。