【2017 X Samara Regional Intercollegiate Programming Contest I】Matrix God 题解
题目大意
有三个 n×n 的矩阵 A、B、C,问 A×B 是否等于 C。
元素在模 109+7 意义下。
n≤1000
题解
新套路 get。
直接矩阵乘法 O(n3) 很大,考虑把这个降下来。
随机几个 n×1 的向量,比如是 v,那么就是判断 ABv是否等于 Cv。
这样矩阵乘法就是 O(n2) 的了!!!
证明
UPD:终于在多年以后的毛营学到了证明 qaq
如何分析这个算法的正确率呢?
如果 ∃v=0,使得 ABv=Cv,那么 AB 一定不等于 C。
也就是说,我们的算法错误意味着 ∃v=0,ABv=Cv但 AB=C。由 ABv=Cv得:
(AB−C)v=0
这表示 v∈Nul(AB−C)。但由于 AB−C=0,所以 Rank(AB−C)>0,dimNul(AB−C)<n。因此,随机到一个这样一个向量 v的概率是 n维空间小于n维的空间,也就是 0。
也就是说,理论上,当矩阵内的数的取值是任意实数的话,只用随机一次就够了。
但很多时候矩阵内的数的取值是有限制的。例如,规定三个矩阵都是 01 矩阵,运算在 mod2 意义下,那么 n维空间小于n维的空间 就不能说等于 0 了,而只能说是小于 21。因此,要随机多几次,比如 10 次,使得错误概率 Pwrong<(21)10=10241。
当矩阵内的数的取值范围逐渐增大时,n维空间小于n维的空间 越来越接近于 0,则可以随机少一些。