P4778 Counting Swaps

题意:给定一个 \(1\sim n\) 的排列 \(a\)。每次可以选两个位置 \(i,j\),耗费 \(1\) 的代价交换 \(a_i,a_j\)。问使得 \(a\) 升序排列的最小代价是多少,以及方案数。\(1\le n\le 10^5\)

求最小代价:连边 \(i\rightarrow a_i\),得到若干个环。一个大小为 \(x\) 的环需要 \(x-1\) 次操作消除。答案就是每个环的大小 \(-1\) 之和。

这个结论会用到一个引理:\(k\) 大小的环至少 \(k-1\) 次操作变成 \(k\) 个自环。这可以用数学归纳法证明。

然后是方案数。令 \(f_i\) 表示大小为 \(i\) 的环变成 \(i\) 个自环的方案数。初值 \(f_1=0\)

一次操作可以把 \(i\) 大小的环拆成两个大小为 \(x,y\) 的环,要求 \(x+y=i\)。然后考虑有多少种方法拆出 \(x,y\) 两个环。注意到如果 \(x=y\),方案数为 \(i/2\);否则方案数为 \(i\)。记 \(T(x,y)=(\dfrac{1}{2})^{[x=y]}\cdot i\)。最后,两个环各自变成自环的操作可以随意排列。

于是有 $$f_i=\sum_{x+y=i}f_x\cdot f_y\cdot T(x,y)\cdot \dfrac{i-2}{(x-1)!(y-1)!}$$

先求出 \(f[]\)。假设图中有环,长度为 \(L_1,L_2,\dots,L_k\)。则总方案数为: $$ans=(\prod_{i=1}^k f[L_i])\cdot (\dfrac{(n-k)!}{\prod_{i=1}^{k}(L_i-1)!})$$

\(ans\) 在预处理 \(f\) 后,用快速幂等方法可以做到接近线性。而复杂度瓶颈在于求 \(f\)。复杂度为 \(O(n^2\log n)\)

以上是本题一半的解法,也是比较合理的思路。如果使用分治 FFT 等黑科技优化,可能可以通过本题。但是这里有一个更优美的做法。

然后是一个毫无理由的观察\(f[n]=n^{n-2}\)。下面给出这个结论的组合意义证明。

证明:咕咕

posted @ 2024-10-01 10:28  FLY_lai  阅读(3)  评论(0编辑  收藏  举报