关于kuangbin矩阵专题内题目的小结

关于kuangbin矩阵专题内题目的小结

大致从这几点分类来小结:

  1. 矩阵运算的简单优化
  2. 取模要求的些许处理
  3. 结合矩阵的优化操作
  4. 各式各样的构造思路
  5. 常常要求的求和操作

1.矩阵运算的简单优化

根据结合律,调整矩阵的运算顺序有时可能会有显著优化,这取决于矩阵的形状,如:【HDU-4965】Fast Matrix Calculation

对于稀疏矩阵,我们可以稍微调整一下矩阵乘法内部的循环顺序,就可以实现先判断其中一个矩阵要相乘的那个位置上是否是0,如果是则不用去遍历另一个矩阵与它相乘的元素,因为结果一定都是0,如:【UVA-11651】Krypton Number System

另外,我们可以直接将记录着初始数据的那个列向量(因为我比较习惯的形式是\(A_n = TA_{n – 1}\)),我们在解决竞赛程序问题时,可以对矩阵快速幂这个函数要返回的那个矩阵结果初始化为这个列向量,只要把它排到第一列上,后面几列保持0,而不用初始化为单位矩阵,这样做之后,矩阵内可能出现大量的0,结合上面的稀疏矩阵的简单优化,可以获得一个不错的效果。同时,这样做也能够有效减少代码量,如:【HDU-4565】So Easy!【矩阵快速幂+向上取整的处理】【FZU-1911】Construct a Matrix【构造问题】。【对于一个斐波那契数列,我们可以直接从第二列来获得某一项的结果】。

对于循环矩阵,我们注意到循环矩阵与循环矩阵相乘结果一定是循环矩阵,所以只需要维护一行就可以,而不需要一直维护多行,这样可以有效减少复杂度\(n^3 \rightarrow n^2\),如:【UVA-1386】Cellular Automaton【循环矩阵的矩阵快速幂】

2.取模要求的些许处理

取模也是常常碰到的问题,有的需要将负数取模变成正数:【CodeForces-450B】Jzzhu and Sequences【矩阵快速幂】,有的可能需要计算出取模值:【UVA – 10689】Yet another Number Sequence等。

3.结合矩阵的优化操作

dp问题,有时我们可以发现转移规律具有不变性,同时我们判断出这个单次转移的最远距离可以开矩阵来解决,这样我们就可以使用矩阵快速幂来进行状态转移:【UVA-11651】Krypton Number System

4.各式各样的构造思路

简单移项:【CodeForces-450B】Jzzhu and Sequences【矩阵快速幂】

适当修改一些初始值来补全递推关系:【HDU-5015】233 Matrix【矩阵快速幂】

分类讨论得到统一的递推关系:【HDU-4990】Reading comprehension

推导公式中局部的递推关系,比如幂次符合递推:【HDU-4549】M斐波那契数列【数论+矩阵快速幂】

根据每一个状态构建多元组,找到状态转移的不变规律:【CodeForces-385E】Bear in the Field【矩阵快速幂】

使用组合数来构建:【CodeForces-392C】Yet Another Number Sequence

将表达式剥离出一定的项,得到的表达式系数满足递推关系:【HDU-4565】So Easy!【矩阵快速幂+向上取整的处理】

更多情况下,对于题目给出递推式,一种思路是列出前几项找递推关系:【UVA-10655】Contemplation! Algebra【矩阵快速幂】,另一种思路是,直接将一个式子中包含当前项的数全都转化上一项:【HDU-4686】Arc of Dream【矩阵快速幂】

5.常常要求的求和操作

求和常见两种操作,一种是给转移矩阵加一行记录求和值:【HDU-4686】Arc of Dream【矩阵快速幂】【FZU-1911】Construct a Matrix【构造问题】,还有一种是找到可行的分治策略:【UVA-11149】Power of Matrix【矩阵快速幂】

 

其它:降幂操作:使用费马小定理【HDU-4549】M斐波那契数列【数论+矩阵快速幂】