首先根据一番推导,不包含
L 的倍数长度的排列长度由
exp(−k≥1∑kLzkL)1−x1=(1−zL)1/L/(1−z)
这一 EGF 表示,因此令
k=⌊n/L⌋,可得
[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!,答案
L 对应的就是
k!Lkn!(L−1)(2L−1)⋯(kL−1)
我们欲计算此式并不能太直接,因为是取模
P−1,它并不是个质数。
我们考虑将
P−1 的
≤n 部分之质因子分解出,记为
P−1=Rp1α1p2α2⋯pwαw,考虑计算
k!Lkn!mod(P−1),它必然是整数。
我们考虑递增地计算所有的
L,这时
k 是递减的,那么
k!n! 我们可以维护其抛去
p1,p2,…,pw 互质之部分的乘积,以及
p1,p2,…pw 各部分的质因子次数。我们对于过程中乘进去的每个数都暴力加入,因为这样的总共次数是
i=1∑wk=1∑∞⌊pikn⌋<pk≤n∑pkn=Θ(nloglogn)
对于除以
Lk 部分,如果
p 和
pi 不重合那么就直接
Θ(k) 乘就完事了,并且剩下的部分也没有必要
Θ(w) 计算,我们应该直接存一个乘了所有部分的值,否则就是减去对应的质因子数量,然后进行求值。总共进行
Θ(w) 次求值的只有
∑ilogpin 那么多,不是复杂度瓶颈。至于求出
pitmodP−1 的值,注意到
t≤∑⌊n/pik⌋,所以我们直接打表的大小是不超过
nloglogn 的。
综上所述,结合快速幂部分的复杂度,整道题可以在
Θ(nloglogn+lognnlogP) 时间内求算。
附录:需要用到的界
Mertens 第二定理告诉我们,
p≤n∑p1=lnlnn+C+O(lnn1)
由此我们不难得到所有
pk 的倒数和的界:
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)