SP419/422 TRANSP(2) - Transposing is Fun

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

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

发现有两个特殊性质:置换为转置,矩阵的边长为 \(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)\).

posted @ 2021-12-12 11:01  Achtoria  阅读(44)  评论(0编辑  收藏  举报