根据递推公式构造系数矩阵用于快速幂
简单的例子
Fibonacci数列
考虑 Fibonacci Fibonacci数列,
F(n)=F(n-1)+F(n-2)
将右边两项看做是一个列向量的形式,令
X_{n-1}=\left\{\begin{matrix}F_{n-1}\\F_{n-2}\end{matrix}\right\}
很容易得到 Xn X_n的形式,即
X_{n}=\left\{\begin{matrix}F_{n}\\F_{n-1}\end{matrix}\right\}
现在的任务就是找到一个系数矩阵 A A,使得AXn−1=XnAX_{n-1}=X_n,且 A A需与nn无关。
如果能够找到这个 A A,则易知An−1X1=XnA^{n-1}X_1=X_n,于是可以利用矩阵快速幂计算出 Xn X_n。这样就可以在 O(logn) O(\log{n})的时间内计算出指定的 Fibonacci Fibonacci数。
这个矩阵很容易找,观察易得
A=\left\{\begin{matrix}1&1\\1& 0\end{matrix}\right\}\tag{1}
Fibonacci数列变种
推广一下,如果令 Fn=aFn−1+bFn−2 F_n=aF_{n-1}+bF_{n-2},则系数矩阵为
A=\left\{\begin{matrix}a&b\\1& 0\end{matrix}\right\}\tag{2}
利用二项式展开构造矩阵
计算k次方和
Fibonacci Fibonacci数列只是最简单的例子,对于稍微复杂一点的例子,二项式展开是常用的一项技术。
考虑计算:
S_n=\sum_{i=1}^n{i^k}
易得
S_n=n^k+S_{n-1}
如果仿照 Fibonacci Fibonacci数列,令
X_{n-1}=\left\{\begin{matrix}n^k\\S_{n-1}\end{matrix}\right\}
则
X_{n}=\left\{\begin{matrix}(n+1)^k\\S_{n}\end{matrix}\right\}
此时,可求出
A=\left\{\begin{matrix}\left({\frac{n+1}{n}}\right)^{k}&&0\\1&&1\end{matrix}\right\}
这个系数矩阵很明显是不能用的,因为它与 n n有关,无法将递推公式转化为矩阵的幂运算。
这里需要使用二项式展开。
S_n=(n-1+1)^k+S_{n-1}\\=C_k^0(n-1)^k+C_k^1(n-1)^{k-1}+\cdots+C_k^k+S_{n-1}
此时,如果令
X_{n-1}=\left\{\begin{matrix}(n-1)^k\\(n-1)^{k-1}\\\vdots\\(n-1)^0\\S_{n-1}\end{matrix}\right\}
则有
X_{n}=\left\{\begin{matrix}n^k\\n^{k-1}\\\vdots\\n^0\\S_{n}\end{matrix}\right\}
现在的任务与刚才一样,找到一个系数矩阵 A A,使得AXn−1=XnAX_{n-1}=X_n,且 A A需与nn无关。
有关 Sn S_n的递推公式实际上就指明了 A A的最后一行。而利用二项式展开很容易得到其他行。
有
A=\left\{\begin{matrix}C_k^0&&C_k^1&&\cdots&&C_k^k&&0\\0&&C_{k-1}^0&&\cdots&&C_{k-1}^{k-1}&&0\\\vdots&&\vdots&&\ddots&&\vdots&&\vdots\\0&&\cdots&&\cdots&&C_0^0&&0\\C_k^0&&C_k^1&&\cdots&&C_k^k&&1\end{matrix}\right\}\tag{3}
最后有
A^{n-1}X_1=X_n
且
X_1=\left\{1\space1\space\cdots\space1\right\}^T
利用该系数矩阵可以在 O(k3logn) O(k^3\log{n})时间内计算出 k k次方的和。
更一般的例子
再考虑一个一般情况:
S_n=\sum_{i=1}^n{(ai+b)^k}
与刚才几乎一模一样,有
S_n=[a(n-1)+(a+b)]^k+S_{n-1}\\=C_k^0a^k(n-1)^k+C_k^1a^{k-1}(a+b)(n-1)^{k-1}+\cdots+C_k^k(a+b)^k+S_{n-1}
剩下的步骤,也几乎完全与之前的一样,令
X_{n-1}=\left\{\begin{matrix}(n-1)^k\\(n-1)^{k-1}\\\vdots\\(n-1)^0\\S_{n-1}\end{matrix}\right\}
则
X_{n}=\left\{\begin{matrix}n^k\\n^{k-1}\\\vdots\\n^0\\S_{n}\end{matrix}\right\}
同样,有关 Sn S_n的递推公式实际上就指明了 A A的最后一行,其他行则利用二项式展开得到。
有
A=\left\{\begin{matrix}C_k^0&&C_k^1&&\cdots&&C_k^k&&0\\0&&C_{k-1}^0&&\cdots&&C_{k-1}^{k-1}&&0\\\vdots&&\vdots&&\ddots&&\vdots&&\vdots\\0&&\cdots&&\cdots&&C_0^0&&0\\C_k^0a^k&&C_k^1a^{k-1}(a+b)&&\cdots&&C_k^k(a+b)^k&&1\end{matrix}\right\}\tag{4}
更复杂的例子
假设要计算如下和式:
S_n=\sum_{i=1}^ni^kk^i
同样,将其写成递推公式,有
S_n=n^kk^n+S_{n-1}\\=(n-1+1)^kk^{(n-1)+1}+S_{n-1}\\=C_k^0(n-1)^kk^{(n-1)+1}+C_k^1(n-1)^{k-1}k^{(n-1)+1}+\cdots+C_k^kk^{(n-1)+1}+S_{n-1}
将与 n n有关的项抽出来作为列向量,令
X_{n-1}=\left\{\begin{matrix}(n-1)^kk^{(n-1)+1}\\(n-1)^{k-1}k^{(n-1)+1}\\\vdots\\(n-1)^0k^{(n-1)+1}\\S_{n-1}\end{matrix}\right\}
则
X_{n}=\left\{\begin{matrix}n^kk^{n+1}\\n^{k-1}k^{n+1}\\\vdots\\n^0k^{n+1}\\S_{n}\end{matrix}\right\}
同样,有关 Sn S_n的递推公式说明了系数矩阵 A A的最后一行。而其他行仍然可以由二项式展开得到,只是相差了一个系数kk而已,这很容易解决。
最后,有
A=\left\{\begin{matrix}kC_k^0&&kC_k^1&&\cdots&&kC_k^k&&0\\0&&kC_{k-1}^0&&\cdots&&kC_{k-1}^{k-1}&&0\\\vdots&&\vdots&&\ddots&&\vdots&&\vdots\\0&&\cdots&&\cdots&&kC_0^0&&0\\C_k^0&&C_k^1&&\cdots&&C_k^k&&1\end{matrix}\right\}\tag{5}
部分题目
POJ3070利用了矩阵1,hdu3369利用了矩阵3和4,hdu3483利用了矩阵5。
根据递推公式构造系数矩阵用于快速幂相关推荐
- BZOJ 3240 构造矩阵+矩阵快速幂
思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...
- HDU-6470 Count (构造矩阵+矩阵快速幂)
题目链接 Problem Description Farmer John有n头奶牛. 某天奶牛想要数一数有多少头奶牛,以一种特殊的方式: 第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶 ...
- HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 简单计数(构造矩阵 矩阵快速幂优化dp)
传送门 示例1 输入 1 1 输出 0 分析: 代码: #include <bits/stdc++.h>using namespace std; typedef long long ll; ...
- 又见斐波那契数列(矩阵构造+矩阵快速幂)
//补题~~~ 链接:https://ac.nowcoder.com/acm/problem/15666 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...
- 矩阵快速幂的最简单用法
矩阵快速幂 链接:https://ac.nowcoder.com/acm/contest/1168/K 来源:牛客网 题目描述 这个勇者明明超强却过分慎重,勇者龙宫院圣哉与n名冒险者一起去讨伐神秘魔物 ...
- HDU5863 cjj's string game(DP + 矩阵快速幂)
题目 Source http://acm.split.hdu.edu.cn/showproblem.php?pid=5863 Description cjj has k kinds of charac ...
- 矩阵快速幂的学习(系统的学习)
学习博客:https://www.cnblogs.com/cmmdc/p/6936196.html https://www.cnblogs.com/yan-boy/archive/2012/11/29 ...
- E. Product Oriented Recurrence(四个矩阵快速幂)
E. Product Oriented Recurrence time limit per test 1 second memory limit per test 256 megabytes inpu ...
最新文章
- js如何关闭当前页,而不弹出提示框
- 性能再提升70%?大咖前瞻带你揭开.NET6的神秘面纱!
- 6.2二叉树及二叉树存储结构
- 内存引起的几种故障的解决
- ios如何清理缓存?
- JavaScriptCore.framework基本用法(一)
- 忽略这一点,人工智能变人工智障的!
- 为什么要用 SpringMVC 的 SessionStatus
- 高度不定垂直居中_CSS垂直居中的七个方法
- 【同124】LeetCode 687. Longest Univalue Path
- 机器学习的最佳入门学习资源【转】
- juniper防火墙命令大全(中文)
- JavaScript中使鼠标光标变为图片
- 关于计算机信息学奥赛视频,震惊!信息学奥赛好处竟然这么多
- SDRAM内存驱动 的学习
- 算法第3章上机实践报告
- 太棒了!快来领养一位你的虚拟女友冰冰吧
- 【SQL语法基础】数据过滤:SQL数据过滤都有哪些方法?
- Mysql 分库分表 Mycat
- UA OPTI544 量子光学1 Maxwell方程与Lorentz Oscillator回顾
热门文章
- GZIP,XZ,LZO,BZIP2,LZMA压缩比较
- c语言中char97,C语言数据类型char
- JavaScript判断对象中每一项属性都不为空
- Unity学习 — VideoPlayer控制视频播放、暂停、上下选择播放!
- timewait php,timewait是什么意思
- 第R1周:RNN-心脏病预测
- 排列数与组合数~~~~
- react合并单元格
- Server2008如何卸载MySQL_Sql Server 2008完全卸载方法(其他版本类似)
- 不合格高校教师的自我总结(学生评价和思考反省)