CF751E

题意

对于两个(n)元排列(A,B),定义其距离为,反复将(A)任意两个位置的元素交换,使得(A)变成(B),的最小操作次数。先给定两个残缺的(n)元排列,要求将?位置填上数字,使得距离(iin[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 eq x_2),否则一开始这条链就会被缩为(0-x)
  • (x_1-0),(0-x_2)这样拼,那么必然是将两个(0)换成(x_3)(x_1-x_3-x_2),同上(x_1 eq 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=sumlimits_{j=i}^m {mchoose 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!)

然后三个卷积一下

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