【2017 X Samara Regional Intercollegiate Programming Contest I】Matrix God 题解

题目大意

  有三个 n×nn\times n 的矩阵 AABBCC,问 A×BA\times B 是否等于 CC
  元素在模 109+710^9+7 意义下。
  n1000n \leq 1000

题解

  新套路 get。

  直接矩阵乘法 O(n3)O(n^3) 很大,考虑把这个降下来。

  随机几个 n×1n\times 1 的向量,比如是 v\vec v,那么就是判断 ABvAB\vec v是否等于 CvC \vec v

  这样矩阵乘法就是 O(n2)O(n^2) 的了!!!

证明

  UPD:终于在多年以后的毛营学到了证明 qaq

  如何分析这个算法的正确率呢?

  如果 v0\exists \vec v \not= 0,使得 ABvCvAB \vec v \not= C \vec v,那么 ABAB 一定不等于 CC
  也就是说,我们的算法错误意味着 v0\exists \vec v\not= 0ABv=CvAB \vec v=C \vec vABCAB\not= C。由 ABv=CvAB \vec v=C \vec v得:

(ABC)v=0(AB-C)\vec v=0

  这表示 vNul(ABC)\vec v∈Nul(AB-C)。但由于 ABC0AB-C\not=0,所以 Rank(ABC)>0Rank(AB-C)>0dimNul(ABC)<n\dim Nul(AB-C)<n。因此,随机到一个这样一个向量 v\vec v的概率是 小于n维的空间n维空间\frac{小于n维的空间}{n维空间},也就是 00

  也就是说,理论上,当矩阵内的数的取值是任意实数的话,只用随机一次就够了。

  但很多时候矩阵内的数的取值是有限制的。例如,规定三个矩阵都是 01 矩阵,运算在 mod2\bmod 2 意义下,那么 小于n维的空间n维空间\frac{小于n维的空间}{n维空间} 就不能说等于 00 了,而只能说是小于 12\frac{1}{2}。因此,要随机多几次,比如 10 次,使得错误概率 Pwrong<(12)10=11024P_{wrong}<(\frac{1}{2})^{10}=\frac{1}{1024}
  当矩阵内的数的取值范围逐渐增大时,小于n维的空间n维空间\frac{小于n维的空间}{n维空间} 越来越接近于 00,则可以随机少一些。