矩阵

我知道 世上的歌没有被 唱完的可能

我明白 张开翅膀需要有 怎样的英勇

我从来都不笨重 只是背着一个梦

笨鸥一直飞 伴着浪花的歌声

——洛天依《笨鸥》


矩阵

绝大部分应用是和矩乘相关的。常用于优化 dp 和与线段树等数据结构结合,或者说优化线性变换。

天依宝宝可爱!


洛谷 P3746

思维难度:\(\color{#52C41A} 绿\) *1600

怎么还可以把组合数转化成组合意义再 dp 的。

题意就是要求这个式子:

\[\binom {nk} r + \binom {nk} {k+r} + \binom {nk} {2k+r} + \cdots + \binom {nk} {nk + r} \]

那个 \(\infin\) 可以不用管,因为当下标足够大的时候后面全都是 \(0\)

显然不能直接求。但是注意到 \(k,r\) 都很小,而且每个下标 \(\bmod k\) 的值都为 \(r\),所以考虑转化为组合意义,那么上面这一坨就是在 \(nk\) 个物品里选 \(\bmod k = r\) 个满足的方案数。

显然是 dp 的形式,设 \(f_{i,j}\) 为前 \(i\) 个物品选 \(\bmod k = j\) 个的方案数,考虑是否选当前物品,有转移:

\[f_{i,j} = f_{i-1,j} + f_{i-1,(j-1) \bmod k} \]

矩阵快速幂优化即可。复杂度 \(O(k^3 \log (nk))\)

submission

天依宝宝可爱!


洛谷 P7453

思维难度:\(\color{#F39C11} 橙\) *1000

线段树 + 矩阵乘法。

注意到要维护的所有对于三元组的操作都可以通过矩阵乘法来做,所以就直接线段树维护乘法就可以了。

但是卡常。需要循环展开 + 特判稀疏矩阵。

然后封装的 vector 板矩阵时间空间常数巨大,需要改成普通数组。

诶不过我线段树开 \(3\) 倍空间过了。

submission

你说为什么不是用 littlebug(#541634) 交的题啊……因为被 某唐诗小朋友 举报小号过多然后给我封了()...

天依宝宝可爱!


LOJ 6208

思维难度:\(\color{#F39C11} 橙\) *1000

树剖套线段树维护矩乘。

两只老哥跑得快。

submission

天依宝宝可爱!


AT_dp_r

思维难度:\(\color{#FE4C61} 红\) *900

矩阵加速 Floyd 板子。

(又忘了自己矩阵板子里 pow 函数是返回一个矩阵而不是改变自身

submission

天依宝宝可爱!


AT_abc236_g

思维难度:\(\color{#FFC116} 黄\) *1400

普通的矩乘所需要的运算一个是 \(+\),一个是 \(\times\),广义矩乘就是换了换二元运算符,但是仍然需要满足普通矩乘的一些良好性质。

具体地,考虑二元运算符 \((\oplus , \otimes)\),则需要满足矩乘的式子:

\[C_{i,j} = \bigoplus _{k} A_{i,k} \otimes B_{k,j} \]

等价于:

  • \(\oplus\) 满足交换律,即 \(a \oplus b = b \oplus a\)
  • \(\otimes\) 计算顺序可改变(不是交换律),即 \(a \otimes (b \otimes c) = (a \otimes b) \otimes c\)
  • \(\otimes\)\(\oplus\) 有分配律,对应的 \(\otimes\) 关于 \(\oplus\) 有结合律,即 \((a \otimes c) \oplus (b \otimes c) = (a \oplus b) \otimes c\)
  • 存在幺元,存在零元。

从群轮的角度,严格一些的定义的看 这里,如果链接炸了就是 这里

一些常用的二元运算符以及对应的幺元和零元:

id 定义域 \(+\) \(\times\) \(0\) \(1\)
#1 \(\mathbb R \cup \{ -\infin , +\infin \}\) \(\min\) \(\max\) \(+\infin\) \(-\infin\)
#2 \(\mathbb R \cup \{ -\infin , +\infin \}\) \(\max\) \(\min\) \(-\infin\) \(+\infin\)
#3 \(\mathbb R \cup \{ -\infin \}\) \(\max\) \(+\) \(-\infin\) \(0\)
#4 \(\mathbb R \cup \{ +\infin \}\) \(\min\) \(+\) \(+\infin\) \(0\)
#5 \(\forall n \in \mathbb N^+ , [0,2^n) \cap \mathbb N\) 按位或 按位与 \(0\) \(2^n - 1\)
#6 \(\forall n \in \mathbb N^+ , [0,2^n) \cap \mathbb N\) 按位与 按位或 \(2^n - 1\) \(0\)

Tip:用单位矩阵、全零矩阵的时候直接把对应的普通矩阵中的 \(0,1\) 换成上面对应的 \(0,1\) 即可。

回到这个题,第一步显然就是把时间戳当做边权建图。然后注意到 \(L\) 非常大,所以考虑矩阵快速幂优化。

\(f_{i,j}\) 为从 \(1\) 到达 \(i\) 恰好经过 \(j\) 条边的最大边权最小值,类似于 Floyd,显然有转移式:

\[f_{i,j} = \min _k \{ \max (f_{k,j-1} , w_{k,i}) \} \]

满足上面 #1 的关系,于是直接矩阵快速幂就好了,容易推出转移矩阵:

\[T = \begin{bmatrix} w_{1,1} & w_{2,1} & \cdots & w_{n,1} \\ w_{1,2} & w_{2,2} & \cdots & w_{n,2} \\ \vdots & \vdots & \ddots & \vdots \\ w_{1,n} & w_{2,n} & \cdots & w_{n,n} \end{bmatrix} \]

submission

天依宝宝可爱!

posted @ 2025-08-19 09:52  little__bug  阅读(26)  评论(0)    收藏  举报