给定两个长度为(nle 10^5)的(01)串 (A, B), 满足 (1) 的数量相等
求通过下列方式将(A)变成(B)的概率 (mod意义下)
构造序列(a,b). 使得 (a_i = A中第i个1的位置), b同理
对(a,b)进行shuffle
然后for i from 1 to n: swap(A[a[i]], A[b[i]])
Analysis
瞎推了一波
显然, (A,B)中同为 (0) 的项没有用的, 且 答案只与 (A,B)中同为(1)的数量, 以及 (A,B)不同的数量有关
注意到求解的问题与 原串的顺序无关, 我们调换成一种 符合自己的思维方式的序列
A: 111111100010001000100
B: 111111100000100010001
a: 1111111 1 1 1
b: 1111111 1 1 1
n个 m对
这是初始的 (a,b)可选 交换点 的位置
定义一次交换为 : 选择一个未使用的交换点(a), 再选择一个未使用的交换点(b), 将他们match
, 然后, 交换(A)中的对应位置
如图
a: 1 1 1 1 1 1 1 a: 1 0 1 1 1 1 1
------------ => ------------
b: 1 1 1 1 1 1 1 b: 1 1 1 1 0 1 1
n m n m
观察到
(1) (a) 中的 (1) 对应着 (A)中的 (1), (B)中的(0), (b) 中的 (1) 对应着 (A)中的 (0), (B)中的(1)
(2) (n)中的每个位置, 每个位置有两个交换点可选. (m) 中的位置, 每个位置仅有一个交换点可选
因此, 我们不可以选择 (n) 中的 (b) 交换点 与 (m) 中的 (a) 交换点 进行匹配. 否则会使 (a) 中的该位置变成 (1), 而该位置需要是 (0), 后续又没有交换点来跟其他位置交换, 永远不能合法
考虑被(match)的位置 组成若干连通块. 因为操作是依次进行, 考虑连通块中 的 第一个操作
(1) (n - n) : 此时, 若被匹配的是同一位置. 连通块只有一条边. 否则, 两个位置各剩余了一个交换点, 一个 (a), 一个 (b). 此时:
这个 (a) 不能与 (m) 中的 (b) 连, 否则永远是 (0) (目前只剩一个交换点了)
这个 (b) 不能与 (m) 中的 (a) 连, 这个是之前观察的结果
因此, 只能继续和 (n) 内部连, 接着又有一对 (a,b), 又只能在内部连
因此, 第一步选择了n-n连, 则只能在n内组成连通块
注意到(A)中这些位置都是(1) , 排列顺序是可以任意的
(2) (m-m) : 由于位置均只有一个交换点, 连通块只有一条边
(3) (n- m) : 此时(m)中的点合法了, 但导致一个(n)中的位置变成了(0)
接着这个 (0) 可以在 (n) 被踢皮球 传来传去
然后最后 必须在 (m) 中的某个 (a) 结束, 即
a: 1 1 1 1 1 1 1 a: 1 1 1 0 1 1 1
------ => ------
b: 1 1 1 1 1 1 1 b: 1 1 1 1 0 1 1
n m n m
|
v
a: 0 0 0 0 1 1 1 a: 1 1 1 0 1 1 1
/
------------- <= ------
/
b: 1 0 0 0 0 1 1 b: 1 1 1 1 0 1 1
n m n m
注意, 上图 是交换点的可用状态, 对应(A)中的(0) 从右往左一直被踢到了某个位置, 回归合法
第一步选择了n-m, 则只能在n中转一转, 然后回到m结束
Solution
因此, 一个连通块内的至多一对 (m) 中的点,
我们先用 (m!) 将 (m)中的点 分成 (m)对, 钦定好m中的匹配方法
然后我们先不考虑 只含 (n) 的连通块
考虑块内的排列方案数, 对于含 (m) 连通块, 若含有 (0) 个 (n) 中 的点, 则 方案数(=1)
否则, 方案数 (n)个点组成一条链, (n!)
考虑到最后要 多项式系数 把 (n)分入 不同的连通块, 多项式系数把连通块插在一起
构造生成函数 $$F(i) = i! frac{1}{i!}frac{1}{(i+1)!}=frac{1}{(i+1)!}$$ 第一个阶乘是连通块内顺序, 第二个是把 (i) 分入不同连通块的 多项式系数分母, (i+1) 是连通块大小, 算得是连通块插在一起的分母
那么答案为
剩下的随意排列, 随意组成连通块, 所以是阶乘的平方