首先考虑一个固定排列的答案是什么。考虑它的若干置换环,应该是所有环环长的 LCM,所有数都会转回本来的位置。
现在变成计算所有环的环长的 LCM 的积的问题。注意到这对每个质因数独立,因此我们分别考虑质因数,即我们要计数 \(F_{i,j}\) 表示 \(i\) 这个质因数次数最大值为 \(j\) 的方案数。
直接求不好求,考虑差分变成 \(G_{i,j}\) 表示 \(i\) 这个质因数最大值最多是 \(j\) 的方案数,那么对于每个 \(j\) 只需要考虑质因数中 \(i\) 的次数不超过 \(j\) 的方案数。
我们来考虑一下假设我们知道了排序后环长序列为 \(a_1,a_2,\dots,a_k\),有多少个排列是满足要求的,可以得到是 \(\frac{n!}{\prod a_i}\) ,但是有重复,还要除以每个环长的个数的阶乘。
现在有个问题,我们现在对每个质因数的次数计数,也就是说我们的模数是 \(mod-1\),直接除是不行的。注意到组合数是可以不用乘法逆元计算的,考虑将其变成若干个组合数的乘积。我们一次枚举每个质因数的选的个数,记为质因数 \(k\) 选了 \(j\) 个,之前选了 \(i\) 个,那么应该乘上 \({i+kj\choose i}\prod\limits_{p=1}^{j}{k(j-p+1)-1\choose k-1}(k-1)!\),这样就可以不用乘法逆元了。
再来考虑如何计算每个质因数的答案,直接暴力背包是 \(O(n^3\ln n)\) 的不能过。注意到实际上变化的总共只有 \(O(n\ln \ln n)\) 个,不需要每次 \(O(n)\) 个都放进去背包。也就是说我们让最后乘起来的多项式乘上若干个多项式的逆来得到我们想要的多项式,这里因为每个多项式的零次都是 \(1\) 所以一定有,这样可以把复杂度优化到 \(O(n^2\ln \ln n)\)。
貌似还是过不去。仍然可以注意到每次暴力求逆的时候只有 \(O(\frac{n}{i})\) 个元素是有用的,每次会加进去 \(\frac{n}{i}\) 个元素。又因为 \(\lim\limits_{n\to \infty}\sum\limits_{i=1}^{n}\frac{n^2}{i^2}=\frac{\pi^2}{6}n^2\),所以就是 \(O(n^2)\) 的复杂度。
标签:frac,每个,USACO20OPEN,ln,luogu,多项式,考虑,质因数,Exercise From: https://www.cnblogs.com/275307894a/p/17172261.html