给定两个长度为\(n\le 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\) 是连通块大小, 算得是连通块插在一起的分母

那么答案为

\[m! \sum_{i=1}^n F^m(i) \frac{n!}{(n-i)!} \frac{(n+m)!}{(n-i)!}[(n-i)!]^2=m! \sum_{i=1}^n F^m(i) ~n!~(n+m)!
\]

剩下的随意排列, 随意组成连通块, 所以是阶乘的平方

AGC019-E Shuffle and Swap的更多相关文章

  1. [AGC019E]Shuffle and Swap

    [AGC019E]Shuffle and Swap 题目大意: 给出两个长度为\(n(n\le10000)\)的\(01\)串\(A_{1\sim n}\)和\(B_{1\sim n}\).两个串均有 ...

  2. AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)

    题目链接 https://atcoder.jp/contests/agc019/tasks/agc019_e 题解 tourist的神仙E题啊做不来做不来--这题我好像想歪了啊= =-- 首先我们可以 ...

  3. Solution -「AGC 019E」「AT 2704」Shuffle and Swap

    \(\mathcal{Description}\)   Link.   给定 \(01\) 序列 \(\{A_n\}\) 和 \(\{B_n\}\),其中 \(1\) 的个数均为 \(k\).记 \( ...

  4. 【AtCoder】AGC019

    A - Ice Tea Store 算一下每种零售最少的钱就行,然后优先买2,零头买1 #include <bits/stdc++.h> #define fi first #define ...

  5. Java_Collections工具类

    Collections 工具类 * Collection与Collections区别 Collection 接口,(大部分集合类的实现接口) Collections 工具类(针对列表) * Colle ...

  6. java学习笔记25(Collections类)

    Collections算法类: Collections是一个算法类,提供了一系列静态方法,实现对集合的排序.替换.交换.搜索.拷贝等操作: 用法:Collections.方法名(要操作的集合): 就像 ...

  7. 集合框架(05)Collections

    1.Collections.sort方法(以及自定义的比较字符串长度排序) package Collections; import java.util.*; class StrLenComparato ...

  8. Java高级部分概要笔记

    复习 多线程 程序.进程.线程的概念.区别 并行.并发 创建线程的四种方式:继承Thread.实现Runnable接口.实现Callable接口.线程池 线程的生命周期 线程的同步方式,三种:同步方法 ...

  9. [LeetCode] Shuffle an Array 数组洗牌

    Shuffle a set of numbers without duplicates. Example: // Init an array with set 1, 2, and 3. int[] n ...

随机推荐

  1. 内置函数系列之 map

    map(映射函数)语法: map(函数,可迭代对象) 可以对可迭代对象中的每一个元素,分别执行函数里的操作 # 1.计算每个元素的平方 lst = [1,2,3,4,5] lst_new = map( ...

  2. is和==,encode和decode

    0.编码解码 >encode和decode a = "你好" s = a.encode("GBK") print(s) # b'\xc4\xe3\xba\ ...

  3. 在CentOS VPS上通过SSH安装 MySQL

    输入 yum install mysql-server 按Y继续 安装完成,设置开机启动Mysql,输入 chkconfig --levels 235 mysqld on 然后启动tomcat,输入s ...

  4. 词向量1.md

    词向量 我们以句子分类为例,我们使用深度学习模型对句子进行分类,本质上这个模型的接受的舒服需要是数值型.因为文字是人们抽象出来的一个概念,这个 东西是不能被计算机直接理解的,我们需要人为的将这个文字转 ...

  5. 原子操作和volatile关键字

    原子操作:不可被中断的操作.要么全执行,要么全不执行. 现代CPU读取内存,通过读取缓存再写入主存.先去主存读--->写入缓存---->运行线程--->写入缓存---->写入主 ...

  6. 剑指Offer - 九度1354 - 和为S的连续正数序列

    剑指Offer - 九度1354 - 和为S的连续正数序列2013-11-23 02:02 题目描述: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100. ...

  7. 《Cracking the Coding Interview》——第12章:测试——题目2

    2014-04-24 23:15 题目:你有一段程序,运行了十次每次都在不同的地方崩掉了.已知这段程序只用了标准C或C++库函数,请问有什么思路来找出问题所在. 解法:1. 时间戳每次都不同.2. 随 ...

  8. 把现有Unity3d游戏向Windows Phone 8.1移植(基础)

    最近在将一款现有的游戏向Windows Phone平台移植,暂时完成了一个小阶段,做一个总结. 开发环境: Windows 8.1 系统及以上,愿意的话,用Windows 10 尝鲜也可以. 微软账号 ...

  9. navmesh自动寻路

    一个导航网格(也就是Navmesh)是世界几何体简化的表示法,被游戏代理用于在世界中进行导航.通常,代理(agent )有一个目标,或一个目的地,它试图找到一个路径,然后沿路径导航到达目标.这个过程被 ...

  10. codeforces Registration system

     Registration system A new e-mail service "Berlandesk" is going to be opened in Berland in ...