题意
对于两个(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!)
然后三个卷积一下