题意
给定(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))求。