首先根据一番推导,不包含 L L L 的倍数长度的排列长度由
exp ( − ∑ k ≥ 1 z k L k L ) 1 1 − x = ( 1 − z L ) 1 / L / ( 1 − z ) \exp (-\sum_{k\ge 1} \frac{z^{kL}}{kL}) \frac1{1-x} = (1-z^L)^{1/L}/(1-z) exp(−k≥1∑kLzkL)1−x1=(1−zL)1/L/(1−z)
这一 EGF 表示,因此令 k = ⌊ n / L ⌋ k=\lfloor n/L \rfloor k=⌊n/L⌋,可得
[ z k L ] ( 1 − z L ) 1 / L / ( 1 − z ) = [ z k L ] ( 1 − z L ) 1 / L / ( 1 − z L ) = [ z k L ] ( 1 − z L ) 1 / L − 1 = ( − 1 ) k ( 1 / L − 1 k ) = ( 1 − 1 / L ) ( 2 − 1 / L ) ⋯ ( k − 1 / L ) k ! \begin{aligned} [z^{kL}](1-z^L)^{1/L}/(1-z) &= [z^{kL}](1-z^L)^{1/L}/(1-z^L)\\ & = [z^{kL}](1-z^L)^{1/L-1}\\ & = (-1)^k\binom{1/L-1}{k}\\ &= \frac{(1-1/L)(2-1/L)\cdots (k-1/L)}{k!} \end{aligned} [zkL](1−zL)1/L/(1−z)=[zkL](1−zL)1/L/(1−zL)=[zkL](1−zL)1/L−1=(−1)k(k1/L−1)=k!(1−1/L)(2−1/L)⋯(k−1/L)
然后因为 EGF 最后要乘以 n ! n! n!,答案 L L L 对应的就是
n ! ( L − 1 ) ( 2 L − 1 ) ⋯ ( k L − 1 ) k ! L k \frac{n!(L-1)(2L-1)\cdots(kL-1)}{k!L^k} k!Lkn!(L−1)(2L−1)⋯(kL−1)
我们欲计算此式并不能太直接,因为是取模 P − 1 P-1 P−1,它并不是个质数。
我们考虑将 P − 1 P-1 P−1 的 ≤ n \le n ≤n 部分之质因子分解出,记为 P − 1 = R p 1 α 1 p 2 α 2 ⋯ p w α w P-1 = Rp_1^{\alpha_1}p_2^{\alpha_2}\cdots p_w^{\alpha_w} P−1=Rp1α1p2α2⋯pwαw,考虑计算 n ! k ! L k m o d ( P − 1 ) \frac{n!}{k!L^k} \bmod (P-1) k!Lkn!mod(P−1),它必然是整数。
我们考虑递增地计算所有的
L
L
L,这时
k
k
k 是递减的,那么
n
!
k
!
\frac{n!}{k!}
k!n! 我们可以维护其抛去
p
1
,
p
2
,
…
,
p
w
p_1,p_2,\dots,p_w
p1,p2,…,pw 互质之部分的乘积,以及
p
1
,
p
2
,
…
p
w
p_1,p_2,\dots p_w
p1,p2,…pw 各部分的质因子次数。我们对于过程中乘进去的每个数都暴力加入,因为这样的总共次数是
∑
i
=
1
w
∑
k
=
1
∞
⌊
n
p
i
k
⌋
<
∑
p
k
≤
n
n
p
k
=
Θ
(
n
log
log
n
)
\sum_{i=1}^w \sum_{k=1}^{\infty} \left\lfloor \frac{n}{p_i^k} \right\rfloor < \sum_{p^k \le n} \frac{n}{p^k} = \Theta(n\log \log n)
i=1∑wk=1∑∞⌊pikn⌋<pk≤n∑pkn=Θ(nloglogn)
对于除以 L k L^k Lk 部分,如果 p p p 和 p i p_i pi 不重合那么就直接 Θ ( k ) \Theta(k) Θ(k) 乘就完事了,并且剩下的部分也没有必要 Θ ( w ) \Theta(w) Θ(w) 计算,我们应该直接存一个乘了所有部分的值,否则就是减去对应的质因子数量,然后进行求值。总共进行 Θ ( w ) \Theta(w) Θ(w) 次求值的只有 ∑ i log p i n \sum_i \log_{p_i} n ∑ilogpin 那么多,不是复杂度瓶颈。至于求出 p i t m o d P − 1 p_i^t \bmod P-1 pitmodP−1 的值,注意到 t ≤ ∑ ⌊ n / p i k ⌋ t\le \sum \lfloor n/p_i^k \rfloor t≤∑⌊n/pik⌋,所以我们直接打表的大小是不超过 n log log n n\log \log n nloglogn 的。
综上所述,结合快速幂部分的复杂度,整道题可以在 Θ ( n log log n + n log n log P ) \Theta(n\log \log n + \frac{n}{\log n}\log P) Θ(nloglogn+lognnlogP) 时间内求算。
附录:需要用到的界
Mertens 第二定理告诉我们,
∑
p
≤
n
1
p
=
ln
ln
n
+
C
+
O
(
1
ln
n
)
\sum_{p\le n} \frac 1 p = \ln \ln n + C + O\left(\frac1{\ln n}\right)
p≤n∑p1=lnlnn+C+O(lnn1)
由此我们不难得到所有 p k p^k pk 的倒数和的界:
∑ p k ≤ n 1 p k < ∑ p ≤ n ∑ k ≥ 1 1 p k = ∑ p ≤ n 1 p − 1 = ( ∑ p ≤ n 1 p ) + ( ∑ p ≤ n 1 p ( p − 1 ) ) < ( ∑ p ≤ n 1 p ) + ζ ( 2 ) = ln ln n + C ′ + O ( 1 ln n ) \begin{aligned} &\quad \sum_{p^k\le n} \frac1{p^k}\\ &< \sum_{p\le n} \sum_{k\ge 1} \frac{1}{p^k}\\ & = \sum_{p\le n} \frac{1}{p - 1} \\ & = \left( \sum_{p\le n} \frac 1 p \right) + \left( \sum_{p\le n} \frac 1 {p(p-1)} \right)\\ & < \left( \sum_{p\le n} \frac 1 p \right) + \zeta(2)\\ & = \ln \ln n + C' + O\left(\frac1{\ln n}\right) \end{aligned} pk≤n∑pk1<p≤n∑k≥1∑pk1=p≤n∑p−11=(p≤n∑p1)+(p≤n∑p(p−1)1)<(p≤n∑p1)+ζ(2)=lnlnn+C′+O(lnn1)