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

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

发现有两个特殊性质:置换为转置,矩阵的边长为 \(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. POJ 3264:Balanced Lineup(区间最值查询ST表&线段树)

      Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 75294   Accepted: 344 ...

  2. 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理。距离远时图片放大,距离近时图片缩小

    查看本章节 查看作业目录 需求说明: 使用JavaScript 中的Math对象和勾股定理公式,计算鼠标的位置与页面图片中心点的距离,根据距离对页面上的图片进行放大或缩小处理.距离远时图片放大,距离近 ...

  3. 1.spring系列之优雅的实现接口统一返回

    好处 现在公司开发基本上都是以前后分离模式为主,所以要有个统一的数据格式,这样有什么好处呢? 能够提高前后端对接的效率(特别重要) 代码更加优雅和简洁 对于前端和后端维护更方便容易 实现(直接上代码) ...

  4. shell2-if判断

    1.条件测试类型(判断类型): 将测试结果做为判断依据. 测试类型有以下三种   [ 命令 ] :命令测试法(最常用的)  [[ 命令 ]] : 关键字测试 test 命令 以上是三种都可以,注意单词 ...

  5. 初识python 之 自动拆分转换文本内容

    上一篇升级版,转换文件内容. #!/user/bin env python # author:Simple-Sir # time:2021/7/9 23:32 def txt_2_list(filen ...

  6. python3实现阿里云发短信

    一.准备工作 1.安装阿里云SDK pip install aliyun-python-sdk-core-v3 2.新建签名并等待审核通过 审核通过后,记下**[签名名称](参数1)**,程序中会用到 ...

  7. JMeter_csv文件参数化

    CSV Data Set Config 可以从指定的文件中一行一行的提取文本内容,每行的数据通过分隔符拆解,并与变量名一一对应,就可以供取样器引用了. 所以在配置数据时,我们需要把参数化的数据进行分行 ...

  8. linux安全篇:禁止频繁访问的ip访问nginx

    实验环境 版本:redhat6.5ip:172.16.1.100,172.16.10软件:nginx 172.16.1.10部署nginx [root@localhost tools]# lsngin ...

  9. Zabbix忘记用户名和密码的解决方法

    问题描述: 最近刚搭建了zabbix服务器,然后新增加了一个用户,并且把默认的Admin禁用了.然后这个监控页面一直没关,保持了10多天,今天不小心把浏览器关闭了,重新打开后,突然忘记了用户名,这下麻 ...

  10. JavaScript的执行过程(深入执行上下文、GO、AO、VO和VE等概念)

    JavaScript的执行过程 前言 编写一段JavaScript代码,它是如何执行的呢?简单来说,JS引擎在执行JavaScript代码的过程中需要先解析再执行.那么在解析阶段JS引擎又会进行哪些操 ...