zoukankan      html  css  js  c++  java
  • 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)\).

  • 相关阅读:
    Codeforces 526D Om Nom and Necklace (KMP)
    HDU
    HDU
    Codeforces 219D
    HDU
    HDU
    POJ
    HDU
    HDU
    第二次作业
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15678519.html
Copyright © 2011-2022 走看看