洛谷P6276 [USACO20OPEN]Exercise P(生成函数)

P6276 [USACO20OPEN]Exercise P(生成函数)

题目大意

求所有大小为 n 排列的阶的积 mod P。

一个排列的阶可以认为是它每个循环长度的 LCM

数据范围

\(1 \le n \le 100000\)

解题思路

对于质数 p,我们考虑如何求出它在答案中的次数。

\(\sum_A\sum_{i=1}i[step(A)=p^i]=\sum_A\sum_{i=1}[p^i|step(A)]\)

根据这个式子,我们转化为求阶是 \(p_i\) 倍数的排列个数,这个也不好求,我们容斥一下用总排列数减去阶不是 \(p_i\) 倍数的排列即可。设 \(t = p_i\)

\[\exp\left(\sum_{i=1}\frac{(i-1)!}{i!}x^i-\sum_{i=1}\frac{(it-1)!}{(it)!} x^{it}\right)\\ =\exp\left(\sum_{i=1}\frac{1}{i}x^i-\sum_{i=1}\frac{1}{it} x^{it}\right)\\ =\exp\left(-\ln(1-x)+\frac{1}{t}\ln(1-x^{t})\right)\\ =\frac{(1-x^t)^{\frac 1t}}{1-x} \]

答案就是 \([n!x^n]\frac{(1-x^t)^{\frac 1t}}{1-x}\)

注意到 \((1-x^t)^{\frac 1t}\) 只有 t 的倍数上有值,\(\frac{1}{1-x}\) 是前缀和,设 \(L = \lfloor \frac{n}{t}\rfloor\),有

\[[n!x^n]\frac{(1-x^t)^{\frac 1t}}{1-x}=[n!x^{Lt}]\frac{(1-x^t)^{\frac 1t}}{1-x}\\ =[n!x^{Lt}]\frac{(1-x^t)^{\frac 1t}}{(1-x)^t}\\ =[n!x^{Lt}](1-x^t)^{\frac 1t-1}\\ =n!{L-\frac 1t \choose L}\\ \]

已经差不多了,但这里是 \(\bmod \varphi(p)\),需要进一步展开。

\[n!{L-\frac 1t \choose L}=n!\frac{(L-\frac 1t)(L-\frac 1t-1)\cdots(1-\frac 1t)}{L!}\\ =\frac {n!}{L!t^L}\prod_{i=1}^L(it-1)\\ =n^{\underline{n-Lt}}\prod_{i=1}^L(it-1)(it-1)^{\underline{t-1}}\\ \]

这样就是一段一段的阶乘,我们可以使用数据结构维护了。

posted @ 2020-12-28 18:51  Hs-black  阅读(156)  评论(0编辑  收藏  举报