CF751E

题意

对于两个\(n\)元排列\(A,B\),定义其距离为,反复将\(A\)任意两个位置的元素交换,使得\(A\)变成\(B\),的最小操作次数。先给定两个残缺的\(n\)元排列,要求将?位置填上数字,使得距离\(i\in[0,n)\),的答案\(ans_i\)

做法

考虑两个完整的排列\(A,B\),其距离为:将\(A_i\)\(B_i\)连边,\(n-\)环个数

对于两个残缺的数字,也同样连边,将?换成\(0\),不过其中的\(0\)我们保留下来。
例如\(A_i=1,B_i=0;A_j=0,B_j=1\),则会形成\(0-0\)\(A_i=1,B_i=0;A_j=2,B_j=1\),则会形成\(0-2\)
因为中间的数字是没用的

提前将已经形成的环去掉
最后形成三类两个点的链:\(0-0\)\(0-x\)\(x-0\)
考虑将\(0-x_1,x_2-0\)拼接的情况

  • \(0-x_1\),\(x_2-0\)这样拼,是不行的,因为\(x_1\neq x_2\),否则一开始这条链就会被缩为\(0-x\)
  • \(x_1-0\),\(0-x_2\)这样拼,那么必然是将两个\(0\)换成\(x_3\)\(x_1-x_3-x_2\),同上\(x_1\neq x_2\),所以后面至少得拼个\(0-0\)\(0-0\)变为\(x_2-x_1\),使得\(x_1-x_3-x_2-x_1\)从而形成环。
    这一类情况我们稍后考虑

考虑将\(0-x\)这一类单一的链拼接

  • \(0-x_1-0-x_2\),这类是可以很简单的拼成环。故任意\(i\)\(0-x\)拼成环

考虑将\(x-0\)这一类单一的链拼接

  • 同上

\(0-0\)先等一等再考虑

先处理\(0-x\)单一的链恰好拼接成\(i\)个环的方案数\(f_i\)
不过不好直接处理,令\(g_i\)为至少拼接成\(i\)个环的方案数
\(g_i=\sum\limits_{j=i}^m {m\choose j}S_{j,i}(k+m-j)^{\underline{m-j}}\)

\(m\)\(0-x\)的链数量,\(k\)\(0-0\)的链数量
枚举\(j\)\(0-x\),通过第一类斯特林数算拼成环的方案数,然后剩下\(m-j\)的,选择前驱,可以选择自己,若选择自己,则单独\(x-x\)形成单点环
此时,若\(0-x\)前接\(0-0\),则形成\(0-0\)
\(0-x\)前接\(0-x\),仍然是\(0-x\)
最后全部处理完后,要么是\(0-x\)形成了环,要么是\(0-0\)。显然\(0-0\)的链个数是不变的
然后二项式反演能得到\(f_i\)

同样的,可以得到\(h_i\)\(x-0\)单一的链恰好拼接成\(i\)个环的方案数

\(k\)\(0-0\)链数量,形成\(i\)个环\(l_i\),还需要将链头标号,使得成为\(0-x\)\(l_i=S_{k,i}k!\)

然后三个卷积一下

posted @ 2020-05-26 09:32  Grice  阅读(297)  评论(0编辑  收藏  举报