前置知识
矩阵乘法
对于
r 行
c 列的矩阵
A 和
c 行
t 列的矩阵
B 的乘法 , 其结果为一个
r 行
t 列的矩阵
M , 其中
Mi,j=∑k=1cai,k×bk,j
矩阵快速幂
结合上述定义不难发现,矩阵乘法是满足结合律的,也就是说,对于任意矩阵都有
A×B×C=A×(B×C) ,这使得我们可以对矩阵使用快速幂的思想进行快速运算任意矩阵的高次方,也是矩阵加速运算的基础。
矩阵加速运算
发现
n≤263 , 显然无法正常动态规划。
观察一下朴素动态规划的转移方程:
Fn=Fn−1+Fn−2
这显然是一个齐次方程,对于所有齐次方程,都可以考虑使用矩阵快速幂来进行加速。
考虑定义矩阵
(Fn−1Fn−2)
那么我们思考如何将其转移到
(FnFn−1)
可以发现由状态转移方程,只需要将其乘上
(1110)
原矩阵就会变成
(Fn−1+Fn−2Fn−1)
即为
(FnFn−1)
不难发现,我们可以先将
F2 和
F1 求出构造一个初始矩阵,再将其乘上上述矩阵的
(n−2) 次方就能得到所求矩阵了。
求
n−2 次方的过程可以使用矩阵快速幂来求解。
这道题发现递推式变成了
an=an−1×an−2 ,但是传统的矩阵快速幂是无法求解乘法的,考虑如何将其进行转化:
可以尝试写几项:
n,m,nm,nm2,n2m3,n3m5,n5m8...
已经不难发现,
n 和
m 的系数是一个斐波那契数列,由此就可以使用矩阵快速幂求出第
k 项,需要注意的是,这里斐波那契数列会超出
long long 类型的最大值,所以我们要使用拓展欧拉定理来进行处理。
拓展欧拉定理
abmodφ(p)+φ(p)≡ab(modp)
所以只需要在矩阵快速幂中给每一项
modφ(10) ,即
4 ,最后再加上即可。
这道题中递推式是一个齐次方程,但注意到最终求解的是各数平方之和,我们需要考虑将平方之和作为一项写到矩阵里面,不难发现我们还需要将当前数的平方来进行累加操作,那么此处将当前数的平方拆开(来递推)得到:
an2=x2an−12+2xyan−1an−2+y2an−22
这里发现出现了三项数列中的东西,只需要使用各数的平方和和这三项构造一个矩阵即可,具体的:
可构造
(Snan+12an2an+1an)
那么要转移到下一项,就要乘上
11000x2y22xy01000x0y
其中
Sn=∑i=1nai2 ,
x,y都为给定常数。
正常进行矩阵快速幂即可。