浅谈矩阵

目录

  • 数列递推优化
  • DP优化
  • 数据结构方面
  • 优化图上转移
  • 数学方面

前言

对于矩阵优化的方面,一般的大体思路都是用矩阵来表示状态,然后优化线性的一维递推。
那么矩阵优化的一般原理就是利用已知的递推式,结合矩阵,来完成多次的转移。

常见结论总结

对于一个序列 \(a\) 要经过线性递推到序列 \(b\) ,那么转移矩阵 \(k\)\(k_{i,j}\) 表示 \(a_i\)\(b_j\) 的系数有 \(k_{i,j}\) 的贡献
同时,对于一个长度为 \(n\) 的初始状态,转移矩阵也必然是 \(n*n\) 的大小
如果在我们的递推式中出现了其他变量,那么就考虑将他们也写进状态里

数列递推优化

例题1
矩阵加速

题面很简单,就是一个线性递推数列,让您求某一项

不难发现,我们的初始状态应该是

\[\begin{bmatrix}1&1&1\end{bmatrix} \]

那么目标状态就是

\[\begin{bmatrix}f_i&f_{i-1}&f_{i-2}\end{bmatrix} \]

又依据

\[a_i = a_{i-1} + a_{i-3} \]

\[a_{i-1} = a_{i-1} \]

\[a_{i-2} = a_{i-2} \]

所以可得转移矩阵

\[\begin{bmatrix}1&1&0\\0&0&1\\1&0&0\end{bmatrix} \]

最后的式子就是

\[\begin{bmatrix}1&1&1\end{bmatrix} \times \begin{bmatrix}1&1&0\\0&0&1\\1&0&0\end{bmatrix}^{n-3} = \begin{bmatrix}f_n&f_{n-1}&f_{n-2}\end{bmatrix} \]

例题2 [NOI2012] 随机数生成器
\(X_{n+1} = (aX_n + c) \mod m\)

不难发现,这个题只与一个数有关,可是还有一个 \(c\) 没法处理,那就给它配一个 1
那么转移式子就是

\[\begin{bmatrix}1&X_0\end{bmatrix} \times \begin{bmatrix}1&c\\0&a\end{bmatrix}^n = \begin{bmatrix}1&X_n\end{bmatrix} \]

例题3 [HNOI2011]数学作业
\(1\)\(n\) 的数拼起来之后 \(\mod m\)

不难发现,这道题是无法直接考虑的,于是不难想到按照数位长度分类。
分类之后,就能写出式子

\[C(n) = C(n-1) \times k + n \]

这时出现了一个问题,递推式中出现了一个变量,那就考虑把它也写进初始状态里,又因为

\[n = (n-1) + 1 \]

所以可以写出式子

\[\begin{bmatrix}1&n&1\end{bmatrix} \times \begin{bmatrix}1&1&1\\0&1&1\\0&0&k\end{bmatrix} ^{n-1} = \begin{bmatrix}1&n&C(n)\end{bmatrix} \]

把这些分类的合起来,就做完了。

例题4 [GZOI2017]河神

看完题之后,发现这个题的数据范围非常的像矩阵乘法,但是下边那个递推式长得就不能搞啊
这个时候就需要重新定义矩阵乘法,也就是广义矩阵乘法
这个题里,我们定义有两个矩阵 \(A,B\) ,乘积就是

\[C_{i,j} = \bigoplus\limits_{ 1\leq k \leq n } A_{i,k} \bigotimes B_{k,j} \]

那就可以发现,前面的基本结论———结合律和做贡献都可以满足,那就成功定义了。

我们先定义 \(INF = 11111 \cdots 1\)
那么,初始状态就是

\[\begin{bmatrix}a_i &a_{i+1} &a_{i+2} &\cdots &a_{i+k-1} \end{bmatrix} \]

下一个状态就是

\[\begin{bmatrix}a_{i+1} &a_{i+2} &a_{i+3} &\cdots &a_{i+k} \end{bmatrix} \]

我们发现

  • \(a_i\) 对所有的其它数都没有贡献,而对 \(a_{i+k}\) 的贡献是 \(b_k\)
  • \(a_{i+1}\) 只对下一个矩阵中的自己有贡献,有 \(1\) 的贡献,而在新的我们定义的矩阵乘法中,\(1\) 就是 \(INF\) ,而对 \(a_{i+k}\) 的贡献是 \(b_{k-1}\)
  • \(a_{i+2}\) 只对下一个矩阵中的自己有贡献,有 \(1\) 的贡献,而在新的我们定义的矩阵乘法中,\(1\) 就是 \(INF\) ,而对 \(a_{i+k}\) 的贡献是 \(b_{k-2}\)

\(\cdots\)

那么就不难写出递推式子

\[\begin{bmatrix}a_i &a_{i+1} &a_{i+2} &\cdots &a_{i+k-1} \end{bmatrix} \times \begin{bmatrix}0 &0 &0 &\cdots &0 &b_k\\ INF &0 &0 &\cdots &0 &b_{k-1} \\0 &INF &0 &\cdots &0 &b_{k-2} \\ 0 &0 &INF &\cdots &0 &b_{k-3} \\ \vdots &\vdots &\vdots &\ddots &\vdots &\vdots \\0 &0 &0 &\cdots &INF &b_1 \end{bmatrix} = \begin{bmatrix}a_{i+1} &a_{i+2} &a_{i+3} &\cdots &a_{i+k} \end{bmatrix} \]

这道题就做完了,是很有启发性的。

优化DP

例题5【XR-1】分块
\(f(n)\) , 其中 \(f(i) = \sum\limits_{j=1}^x f(i-a_j) , x \leq 100 ,n \leq 10^{18}\)

是不是看着巨大的 \(n\) 就像矩阵乘法题
那么考虑写一写初始状态

\[\begin{bmatrix}f_i &f_{i-a_1} &f_{i-a_2} &\cdots &f_{i-a_{x-1}} &f_{i-a_x} \end{bmatrix} \]

那下一个状态就是

\[\begin{bmatrix}f_{i+1} &f_{i+1-a_1} &f_{i+1-a_2} &\cdots &f_{i+1-a_{x-1}} &f_{i+1-a_x} \end{bmatrix} \]

转移矩阵就是

\[\]

posted @ 2022-04-16 11:24  sky_light  阅读(177)  评论(0)    收藏  举报