题解 P4795 【[BalticOI 2018]基因工程】
Hatsune_Miku · · 题解
Genetics
基因工程
翻译自 BalticOI 2018 Day 2 题解
感谢 rqy 与 zzq 等 dalao 的大力帮助,才能有下面比较通顺的翻译。
这个问题有一个简单的三次方复杂度做法,还有一个优美的基于随机化的二次方解法(原文: probabilistic quadratic solution)。我们将在稍后描述这个算法。
我们先从二进制字符集的情况开始。这种情况下,我们可以让数学更优美一些:我们把两个字母 A 和 C 看作数字
(译者:如果不能理解括号里的内容,请参考下面的原文。)
(up to some constant factor and linear rescaling — instead of wanting sums to equal
K , we want them to equalK' = M = 2K )
现在我们想要做的是检查对于所有满足
(译者:如果不能理解「检查 Foo 与 Bar 是否相等」,请参考下面的原文。)
... and then check that the dot product against the combined sum
\sum_{i'}w_{i'}A_{i'} equals(\sum_{i'}w_{i'}-w_i)\cdot K' (wherei is the row we're checking).
用稍微具象一点的数学术语来讲,并且推广到更大的字符集,我们在每一行中随机选取
如果这一行不是答案,和式很有可能不等于那个值。将一行中的任何一个
有趣的一些东西:
-
要生成这题的测试数据非常麻烦。针对应该被卡掉的暴力,我们希望几乎所有 的行之间都有不为
K 个的字符不同,但是要有一行恰好与所有其它各行有恰好K 个字符不同。出题人知道的唯一的恰好有相同个数元素不相同的矩阵有:单位矩阵 (其中N=M,\,K=2 )、常数矩阵(其中K=0 ) 和广义 Hadmard 矩阵(其中N=M,\, K=N(1-1/A) ),以及它们三者的结合。其中A 表示|\Sigma| 。对于二进制字符集,Hadmard 矩阵被定义为一个大小为N\times M(N=M) 的0-1 矩阵,其中所有各行恰有N/2 个元素不同。对这种矩阵的研究已经十分深入,并且构造这个矩阵的一种简单的方法是递归:从矩阵H=[1] 开始,重复地用
\begin{bmatrix}H&H\\H&H\oplus1\\\end{bmatrix} 替换掉
H 。其中H\oplus1 表示H 的所有元素都异或1 。这会产生一个大小为2 的整数次幂的 Hadamard 矩阵。对于
|\Sigma| = 4 我们可以做一些更复杂的工作,将H 用\begin{bmatrix}H&H&H&H\\H&H\oplus1&H\oplus2&H\oplus3\\H&H\oplus2&H\oplus3&H\oplus1\\H&H\oplus3&H\oplus1&H\oplus2\\\end{bmatrix} 替代。
对这个矩阵会产生正确的矩阵的证明留给读者作为练习(这个构造来自
GF(4) 的乘法表,要求有较高的数学素养)。给定一个行与行之间都有
K 个字符不同的矩阵,我们可以采用多种方式对矩阵进行一些扰动,以使答案唯一,例如复制矩阵的某些行或改变矩阵的一些二进制位。这些复杂的构造过程部分解释了限制部分 — 难以构造字符集大小不为
2 的整数次幂的 Hadmard 矩阵。 -
存在一个复杂度低于
O(n^3) 的解法:由于矩阵元素的取值集合为\{-1,\,1\} ,我们可以简单地计算A\cdot A^T ,然后从中寻找值为K 的元素,矩阵乘法在理论上可以在O(n^{2.373}) 的时间复杂度内完成计算,虽然实现起来有些麻烦,并且常数巨大。