CF1516E

题意

给定(n,K),初始(a_i=i(1le ile n)),每次操作选择两个不同的位置交换。
(1le ile K),进行恰好(i)次操作的排列的个数。
(nle 10^9,Kle 200)

做法1

有众多的(O(K^3))做法,这里介绍一个(O(Klog Klog n))的。

(f(i,j))(i)阶排列,进行(j)次的方案数。
(f(i,j)=f(i-1,j)+(i-1)f(i-1,j-1))
初始(f(2,j)=1)

写成生成函数的形式:(F(2)=frac{1}{1-x},F(n)=F(n-1)(1+(n-1)x)=frac{1}{1-x}prodlimits_{k=2}^{n-1}(1+kx))

(prodlimits_{k=1}^N (1+kx))可以倍增:
假设(prodlimits_{k=1}^N (1+kx)=sumlimits_{i=0}^{infty} a_ix^i)
那么有:

[egin{aligned} prodlimits_{k=N+1}^{2N}(1+kx)&=prodlimits_{k=1}^N (1+(k+N)x)\ &=sumlimits_{i=0}^{infty}a_ix^i(sumlimits_{j=0}^{N-i} {N-ichoose j}N^jx^j)\ end{aligned}]

后面那个可以轻松的写成卷积形式,总复杂度(T(n)=T(n/2)+O(Klog K)=O(Klog K log n))

做法2

学了个(O(Klog K))
(prodlimits_{k=1}^N (1+kx)= ext{epx}(sumlimits_{k=1}^N ext{ln}(1+kx)))
(sumlimits_{k=1}^N ext{ln}(1+kx)=sumlimits_{k=1}^N =sumlimits_{k=1}^N sumlimits_{i=1}^{infty} frac{(-kx)^i}{i})

(sumlimits_{k=1}^N sumlimits_{i=1}^{infty} k^ifrac{x^i}{i!}mod x^{K+1})可以(O(Klog K))求。

原文地址:https://www.cnblogs.com/Grice/p/14688488.html