蓝桥杯 算法提高 递推求值(矩阵快速幂)详解

这篇博客介绍了如何使用矩阵快速幂解决递推求值问题,以蓝桥杯竞赛中的一道题目为例,详细解析了从问题描述到矩阵快速幂的转换过程。通过矩阵乘法和快速幂算法,解决了大规模数据下的递推计算,避免了超时问题。文章提供了矩阵快速幂的模板,并讨论了在Java中实现矩阵乘法的方法。
摘要由CSDN通过智能技术生成

传送门

问题描述

已知递推公式:

F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,

F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.

初始值为:F(1, 1)=2, F(1, 2)=3, F(2, 1)=1, F(2, 2)=4, F(3, 1)=6, F(3, 2)=5。

输入n,输出F(n, 1)和F(n, 2),由于答案可能很大,你只需要输出答案除以99999999的余数。

输入格式

输入第一行包含一个整数n。

输出格式

输出两行,第一行为F(n, 1)除以99999999的余数,第二行为F(n, 2)除以99999999的余数。

样例输入

4

样例输出

14
21

数据规模和约定

1<=n<=10^18。

分析

  • 这道题数据规模大,如果用暴力法解铁定会超时。这时,我们不妨考虑用矩阵快速幂来解决这道题。
  • 矩阵快速幂是就求解递推式的一种比较高效的手段,需要我们找到递推式对应的矩阵运算等式,把求递推式问题转换为求矩阵乘幂问题,再利用快速幂求解矩阵的幂乘,最后计算结果即可。
  • 用Fibonacci数列来举例,我们找到递推式对应的等式
    ( F ( n ) F ( n − 1 ) ) = ( 1 1 1 0 ) ∗ ( F ( n − 1 ) F ( n − 2 ) ) \begin{pmatrix} F(n) \\ F(n-1) \end{pmatrix}=\begin{pmatrix} 1 &amp; 1 \\ 1 &amp; 0 \\ \end{pmatrix}*\begin{pmatrix} F(n-1) \\ F(n-2) \end{pmatrix} (F(n)F(n1))=(1110)(F(n1)F(n2))
    ,再把右边的
    ( F ( n − 1 ) F ( n − 2 ) ) \begin{pmatrix} F(n-1) \\ F(n-2) \end{pmatrix} (F(n1)F(n2))
    继续往下分解到n-1=2,可得
    ( F ( n ) F ( n − 1 ) ) = ( 1 1 1 0 ) n − 2 ∗ ( F ( 2 ) F ( 1 ) ) \begin{pmatrix} F(n) \\ F(n-1) \end{pmatrix}=\begin{pmatrix} 1 &amp; 1 \\ 1 &amp; 0 \\ \end{pmatrix}^{n-2}*\begin{pmatrix} F(2) \\ F(1) \end{pmatrix} (F(n)F(n1))=(1110)n2(F(2)F(1))
    ,这就把问题转化为利用矩阵快速幂求
    ( 1 1 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值