CF1516E

题意

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

做法1

有众多的\(O(K^3)\)做法,这里介绍一个\(O(K\log K\log 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}\prod\limits_{k=2}^{n-1}(1+kx)\)

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

\[\begin{aligned} \prod\limits_{k=N+1}^{2N}(1+kx)&=\prod\limits_{k=1}^N (1+(k+N)x)\\ &=\sum\limits_{i=0}^{\infty}a_ix^i(\sum\limits_{j=0}^{N-i} {N-i\choose j}N^jx^j)\\ \end{aligned}\]

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

做法2

学了个\(O(K\log K)\)
\(\prod\limits_{k=1}^N (1+kx)=\text{epx}(\sum\limits_{k=1}^N \text{ln}(1+kx))\)
\(\sum\limits_{k=1}^N \text{ln}(1+kx)=\sum\limits_{k=1}^N =\sum\limits_{k=1}^N \sum\limits_{i=1}^{\infty} \frac{(-kx)^i}{i}\)

\(\sum\limits_{k=1}^N \sum\limits_{i=1}^{\infty} k^i\frac{x^i}{i!}\mod x^{K+1}\)可以\(O(K\log K)\)求。

posted @ 2021-04-22 10:53  Grice  阅读(95)  评论(0编辑  收藏  举报