首先可以发现转置本质上就是一个置换,问题就转化为求一个排列排成有序的最少次数。

这是一个经典问题,答案为点数减循环置换的个数,考虑如何求循环置换。

发现有两个特殊性质:置换为转置,矩阵的边长为 \(2\) 的次幂,据此我们首先不妨写出原本 \(i\) 这个标号换到了什么位置:

\[p_i = ((i - 1) \% 2 ^ n)2 ^ m + \lfloor \frac{i - 1}{2 ^ n} \rfloor + 1
\]

注意到所有与 \(i\) 有关的位置都是 \(i - 1\),那么我们将标号整体减 \(1\),置换就可以看作是二进制下补齐到 \(n + m\) 位后往左 shift \(m\) 位所得到的新二进制数。

不妨将所有 \(n + m\) 位的二进制数看成一个元素集合,所有本质不同的 \(k\) 次 shift(一种置换)看作是一种运算,两者一起是否构成一个置换群?

首先,容易得知本质不同的 shift 就是 \(mi \% (n + m)\) 不同的个数,即 \(\frac{n + m}{(m, n + m)} = \frac{n + m}{(n, m)}\).

接下来发现证明这是一个群是容易的,此时发现 \(|X / G|\) 就是原本排列的循环置换个数。

由于所有 \(n + m\) 位二进制数都能选到,于是考虑使用 polya 定理:

\[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} |B| ^ {c(g)}
\]

考虑第 \(i\) 个置换的循环置换个数,发现他就等价于将所有元素往左 shift \(mi \% (n + m)\) 位,类似地有 \((n + m, (mi) \% (n + m))\) 个循环置换,那么答案为:

令 \(L = \frac{n + m}{(n, m)}\).

\[Ans = \frac{1}{L}\sum\limits_i ^ {L - 1} 2 ^ {(n + m, (mi) \% (n + m))}
\]

根据裴蜀定理,\(mi \% (n + m)\) 的取值集合为 \(i(n, m)(0 \le i \le L - 1)\),则答案即:

\[\begin{aligned}
& \ \ \ \ \ \frac{1}{L}\sum\limits_i ^ {L - 1} 2 ^ {(n + m, i(n, m))} \\
&= \frac{1}{L}\sum\limits_i ^ {L - 1} 2 ^ {(L, i)(n, m)} \\
&= \frac{1}{L}\sum\limits_{i = 1} ^ L 2 ^ {(L, i)(n, m)} \\
&= \frac{1}{L}\sum\limits_{d \mid L} 2 ^ {d(n, m)} \sum\limits_{i = 1} ^ L [(i, L) = d] \\
&= \frac{1}{L}\sum\limits_{d \mid L} 2 ^ {d(n, m)} \varphi(L / d)
\end{aligned}
\]

注意到 \(d(n, m) \le L(n, m) \le n + m\),那么线性预处理 \(n + m\) 内的 \(\varphi\) 和 \(2\) 的次幂,以及每个数的约数,每次询问枚举所有约数统计答案,复杂度 \(\mathcal{O}(Tn ^ {\frac{1}{3}} + n \ln n)\).

SP419/422 TRANSP(2) - Transposing is Fun的更多相关文章

  1. 小菜学习设计模式(三)—工厂方法(Factory Method)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  2. 基础笔记(三):网络协议之Tcp、Http

    目录 一.网络协议 二.TCP(Transmission Control Protocol,传输控制协议) TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具 三.HTTP(Hyper ...

  3. python(30) 获取网页返回的状态码,状态码对应问题查询

    获取访问网页返回的状态码 html = requests.get(Url) respon = html.status_code 以下内容来自于维基百科:点击查看网页 1xx消息 这一类型的状态码,代表 ...

  4. ruby -- 基础学习(一)项目文件夹说明

    App文件夹子文件夾功能介绍 (1)controllers  存放驱动业务逻辑的控制器 (2)helpers       存放视图辅助类,一些常用的代码段 (3)mailers       Rails ...

  5. 简述WebService的使用(一)

    环境: vs版本:vs2013 windows版本:win7 IIS版本:IIS7.0 (如果觉得对您有用,请点击右下角[推荐]一下,让更多人看到,谢谢) 配置环境: 主要针对于IIS ·首先,有很多 ...

  6. linux设备驱动归纳总结(八):1.总线、设备和驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-109733.html linux设备驱动归纳总结(八):1.总线.设备和驱动 xxxxxxxxxxxx ...

  7. linux设备驱动归纳总结(三):6.poll和sellct【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-61749.html linux设备驱动归纳总结(三):6.poll和sellct xxxxxxxxxx ...

  8. 应用层(一)HTTP服务访问基本流程和HTTP报文详解

    HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...

  9. 手写PE文件(一)

    DOS Header(IMAGE_DOS_HEADER)->64 Byte DOS头部 DOS Stub 112字节 "PE"00(Signature) 4个字节 IMAGE ...

随机推荐

  1. [平台建设] HBase平台建设实践

    背景 由于公司业务场景的需要,我们需要开发HBase平台,主要需要以下功能: 建表管理 授权管理 SDK实现 与公司内部系统打通 我们使用的HBase 版本: HBase 1.2.0-cdh5.16. ...

  2. 洛谷 P3431:[POI2005]AUT-The Bus(离散化+DP+树状数组)

    题目描述 The streets of Byte City form a regular, chessboardlike network - they are either north-south o ...

  3. AOP 日志切面

    AOP把软件的功能模块分为两个部分:核心关注点和横切关注点.业务处理的主要功能为核心关注点,而非核心.需要拓展的功能为横切关注点.AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点进行分 ...

  4. Sublime Text 3菜单栏隐藏后怎么显示

    Sublime Text 3如何显示菜单栏 今天在使用Sublime Text 3敲代码的时候不小心就把上侧的菜单栏隐藏了,自己鼓捣了半天才把菜单栏弄出来,下面我就给大家讲解一下我是如何操作的 键盘按 ...

  5. Notepad++汉化教程

    Notepad++汉化方法总结 Notepad++系统只带了中文语言包,不需要像其他软件一样破解 打开Notepad++(通过文本文件右键选择以Notepad++打开或者找到Notepad++的快捷方 ...

  6. 向setup.py里添加自定义command

    向setup.py里添加自定义command 参考这里 继承distutils.cmd.Command类: class CCleanCommand(distutils.cmd.Command): &q ...

  7. 使用 Eclipse 创建一个静态的登录页面

    要求: 使用 Eclipse 创建一个静态的登录页面 实现步骤: 在 Eclipse 中,点击"File",显示菜单,选择"New" "Other&q ...

  8. 微信小程序--数据共享与方法共享

    目录 全局数据共享 Mobox npm安装及其注意事项 小程序对 npm 的支持与限制 npm 依赖包的安装与使用 Mobox 1. 全局数据共享 2. 小程序中的全局数据共享方案 3. 使用mobx ...

  9. RabbitMQ开启SSL与SpringBoot连接测试

    楔子 近期公司程序被安全扫描出 远程主机允许明文身份验证 中风险漏洞,查了下修复方案,RabbitMQ官方提供了SSL连接方式,而且 SpringBoot AMQP 也支持 SSL 连接.以下将配置R ...

  10. centos 操作系统优化

    命令提示符优化 修改PS1环境变化 vim /etc/profile #在最后一行添加 export PS1='[\u@\H \w]$' \u ---显示当前登录用户名称 \h ---显示系统主机名称 ...