专栏文章

矩阵加速运算

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min8ep6t
此快照首次捕获于
2025/12/01 22:15
3 个月前
此快照最后确认于
2025/12/01 22:15
3 个月前
查看原文

前置知识

矩阵乘法
对于 rrcc 列的矩阵 AAcctt 列的矩阵 BB 的乘法 , 其结果为一个 rrtt 列的矩阵 MM , 其中
Mi,j=k=1cai,k×bk,jM_{i,j} = \sum_{k = 1}^{c}a_{i,k}\times b_{k,j}
矩阵快速幂
结合上述定义不难发现,矩阵乘法是满足结合律的,也就是说,对于任意矩阵都有 A×B×C=A×(B×C)A\times B \times C = A\times (B \times C) ,这使得我们可以对矩阵使用快速幂的思想进行快速运算任意矩阵的高次方,也是矩阵加速运算的基础。

矩阵加速运算

发现n263n \leq 2^{63} , 显然无法正常动态规划。
观察一下朴素动态规划的转移方程:
Fn=Fn1+Fn2F_n = F_{n - 1} + F_{n - 2}
这显然是一个齐次方程,对于所有齐次方程,都可以考虑使用矩阵快速幂来进行加速。
考虑定义矩阵
(Fn1Fn2)\begin{pmatrix} F_{n-1} & F_{n-2} \\ \end{pmatrix}
那么我们思考如何将其转移到
(FnFn1)\begin{pmatrix} F_{n} & F_{n-1} \\ \end{pmatrix}
可以发现由状态转移方程,只需要将其乘上
(1110)\begin{pmatrix} 1 & 1 \\ 1 & 0 \\ \end{pmatrix}
原矩阵就会变成
(Fn1+Fn2Fn1)\begin{pmatrix} F_{n-1}+F_{n-2} & {F_{n-1}} \\ \end{pmatrix}
即为
(FnFn1)\begin{pmatrix} F_{n} & F_{n-1} \\ \end{pmatrix}
不难发现,我们可以先将F2F_2F1F_1 求出构造一个初始矩阵,再将其乘上上述矩阵的 (n2)(n-2) 次方就能得到所求矩阵了。
n2n-2 次方的过程可以使用矩阵快速幂来求解。
例题:P7318-人赢
这道题发现递推式变成了an=an1×an2a_n = a_{n-1} \times a_{n-2} ,但是传统的矩阵快速幂是无法求解乘法的,考虑如何将其进行转化:
可以尝试写几项:
n,m,nm,nm2,n2m3,n3m5,n5m8...n , m , nm , nm^2 , n^2m^3 , n^3m^5 ,n^5m^8...
已经不难发现,nnmm 的系数是一个斐波那契数列,由此就可以使用矩阵快速幂求出第 kk 项,需要注意的是,这里斐波那契数列会超出 long longlong\ long 类型的最大值,所以我们要使用拓展欧拉定理来进行处理。
拓展欧拉定理
abmodφ(p)+φ(p)ab(modp)a^{b \mod\varphi_(p)+\varphi(p)} \equiv a^b\pmod p
所以只需要在矩阵快速幂中给每一项modφ(10)\mod \varphi(10) ,即 44 ,最后再加上即可。
例题:P5175-数列
这道题中递推式是一个齐次方程,但注意到最终求解的是各数平方之和,我们需要考虑将平方之和作为一项写到矩阵里面,不难发现我们还需要将当前数的平方来进行累加操作,那么此处将当前数的平方拆开(来递推)得到:
an2=x2an12+2xyan1an2+y2an22a_n^2 = x^2a_{n-1}^2+2xya_{n-1}a_{n-2}+y^2a_{n-2}^2
这里发现出现了三项数列中的东西,只需要使用各数的平方和和这三项构造一个矩阵即可,具体的:
可构造
(Snan+12an2an+1an)\begin{pmatrix} S_n & a_{n+1}^2 & a_n^2 & a_{n+1}a_{n} \\ \end{pmatrix}
那么要转移到下一项,就要乘上
(10001x21x0y20002xy0y)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 1 & x^2 & 1 & x \\ 0 & y^2 & 0 & 0 \\ 0 & 2xy & 0 & y \\ \end{pmatrix}
其中Sn=i=1nai2S_n = \sum_{i=1}^n a_i^2 , x,yx,y都为给定常数。
正常进行矩阵快速幂即可。

评论

0 条评论,欢迎与作者交流。

正在加载评论...