简单的例子

Fibonacci数列

考虑 Fibonacci Fibonacci数列,

F(n)=F(n−1)+F(n−2)

F(n)=F(n-1)+F(n-2)
将右边两项看做是一个列向量的形式,令

Xn−1={Fn−1Fn−2}

X_{n-1}=\left\{\begin{matrix}F_{n-1}\\F_{n-2}\end{matrix}\right\}
很容易得到 Xn X_n的形式,即

Xn={FnFn−1}

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={1110}(1)

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={a1b0}(2)

A=\left\{\begin{matrix}a&b\\1& 0\end{matrix}\right\}\tag{2}

利用二项式展开构造矩阵

计算k次方和

Fibonacci Fibonacci数列只是最简单的例子,对于稍微复杂一点的例子,二项式展开是常用的一项技术。
考虑计算:

Sn=∑i=1nik

S_n=\sum_{i=1}^n{i^k}
易得

Sn=nk+Sn−1

S_n=n^k+S_{n-1}
如果仿照 Fibonacci Fibonacci数列,令

Xn−1={nkSn−1}

X_{n-1}=\left\{\begin{matrix}n^k\\S_{n-1}\end{matrix}\right\}

Xn={(n+1)kSn}

X_{n}=\left\{\begin{matrix}(n+1)^k\\S_{n}\end{matrix}\right\}
此时,可求出

A=⎧⎩⎨⎪⎪(n+1n)k101⎫⎭⎬⎪⎪

A=\left\{\begin{matrix}\left({\frac{n+1}{n}}\right)^{k}&&0\\1&&1\end{matrix}\right\}
这个系数矩阵很明显是不能用的,因为它与 n n有关,无法将递推公式转化为矩阵的幂运算。
这里需要使用二项式展开。

Sn=(n−1+1)k+Sn−1=C0k(n−1)k+C1k(n−1)k−1+⋯+Ckk+Sn−1

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}
此时,如果令

Xn−1=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(n−1)k(n−1)k−1⋮(n−1)0Sn−1⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪

X_{n-1}=\left\{\begin{matrix}(n-1)^k\\(n-1)^{k-1}\\\vdots\\(n-1)^0\\S_{n-1}\end{matrix}\right\}
则有

Xn=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪nknk−1⋮n0Sn⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪

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=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪C0k0⋮0C0kC1kC0k−1⋮⋯C1k⋯⋯⋱⋯⋯CkkCk−1k−1⋮C00Ckk00⋮01⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(3)

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}
最后有

An−1X1=Xn

A^{n-1}X_1=X_n

X1={1 1 ⋯ 1}T

X_1=\left\{1\space1\space\cdots\space1\right\}^T
利用该系数矩阵可以在 O(k3logn) O(k^3\log{n})时间内计算出 k k次方的和。

更一般的例子

再考虑一个一般情况:

Sn=∑i=1n(ai+b)k

S_n=\sum_{i=1}^n{(ai+b)^k}
与刚才几乎一模一样,有

Sn=[a(n−1)+(a+b)]k+Sn−1=C0kak(n−1)k+C1kak−1(a+b)(n−1)k−1+⋯+Ckk(a+b)k+Sn−1

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}
剩下的步骤,也几乎完全与之前的一样,令

Xn−1=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(n−1)k(n−1)k−1⋮(n−1)0Sn−1⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪

X_{n-1}=\left\{\begin{matrix}(n-1)^k\\(n-1)^{k-1}\\\vdots\\(n-1)^0\\S_{n-1}\end{matrix}\right\}

Xn=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪nknk−1⋮n0Sn⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪

X_{n}=\left\{\begin{matrix}n^k\\n^{k-1}\\\vdots\\n^0\\S_{n}\end{matrix}\right\}
同样,有关 Sn S_n的递推公式实际上就指明了 A A的最后一行,其他行则利用二项式展开得到。

A=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪C0k0⋮0C0kakC1kC0k−1⋮⋯C1kak−1(a+b)⋯⋯⋱⋯⋯CkkCk−1k−1⋮C00Ckk(a+b)k00⋮01⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(4)

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}

更复杂的例子

假设要计算如下和式:

Sn=∑i=1nikki

S_n=\sum_{i=1}^ni^kk^i
同样,将其写成递推公式,有

Sn=nkkn+Sn−1=(n−1+1)kk(n−1)+1+Sn−1=C0k(n−1)kk(n−1)+1+C1k(n−1)k−1k(n−1)+1+⋯+Ckkk(n−1)+1+Sn−1

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有关的项抽出来作为列向量,令

Xn−1=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(n−1)kk(n−1)+1(n−1)k−1k(n−1)+1⋮(n−1)0k(n−1)+1Sn−1⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪

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\}

Xn=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪nkkn+1nk−1kn+1⋮n0kn+1Sn⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪

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=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪kC0k0⋮0C0kkC1kkC0k−1⋮⋯C1k⋯⋯⋱⋯⋯kCkkkCk−1k−1⋮kC00Ckk00⋮01⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪(5)

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。

根据递推公式构造系数矩阵用于快速幂相关推荐

  1. BZOJ 3240 构造矩阵+矩阵快速幂

    思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...

  2. HDU-6470 Count (构造矩阵+矩阵快速幂)

    题目链接 Problem Description Farmer John有n头奶牛. 某天奶牛想要数一数有多少头奶牛,以一种特殊的方式: 第一头奶牛为1号,第二头奶牛为2号,第三头奶牛之后,假如当前奶 ...

  3. HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. 简单计数(构造矩阵 矩阵快速幂优化dp)

    传送门 示例1 输入 1 1 输出 0 分析: 代码: #include <bits/stdc++.h>using namespace std; typedef long long ll; ...

  5. 又见斐波那契数列(矩阵构造+矩阵快速幂)

    //补题~~~ 链接:https://ac.nowcoder.com/acm/problem/15666 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  6. 矩阵快速幂的最简单用法

    矩阵快速幂 链接:https://ac.nowcoder.com/acm/contest/1168/K 来源:牛客网 题目描述 这个勇者明明超强却过分慎重,勇者龙宫院圣哉与n名冒险者一起去讨伐神秘魔物 ...

  7. HDU5863 cjj's string game(DP + 矩阵快速幂)

    题目 Source http://acm.split.hdu.edu.cn/showproblem.php?pid=5863 Description cjj has k kinds of charac ...

  8. 矩阵快速幂的学习(系统的学习)

    学习博客:https://www.cnblogs.com/cmmdc/p/6936196.html https://www.cnblogs.com/yan-boy/archive/2012/11/29 ...

  9. E. Product Oriented Recurrence(四个矩阵快速幂)

    E. Product Oriented Recurrence time limit per test 1 second memory limit per test 256 megabytes inpu ...

最新文章

  1. js如何关闭当前页,而不弹出提示框
  2. 性能再提升70%?大咖前瞻带你揭开.NET6的神秘面纱!
  3. 6.2二叉树及二叉树存储结构
  4. 内存引起的几种故障的解决
  5. ios如何清理缓存?
  6. JavaScriptCore.framework基本用法(一)
  7. 忽略这一点,人工智能变人工智障的!
  8. 为什么要用 SpringMVC 的 SessionStatus
  9. 高度不定垂直居中_CSS垂直居中的七个方法
  10. 【同124】LeetCode 687. Longest Univalue Path
  11. 机器学习的最佳入门学习资源【转】
  12. juniper防火墙命令大全(中文)
  13. JavaScript中使鼠标光标变为图片
  14. 关于计算机信息学奥赛视频,震惊!信息学奥赛好处竟然这么多
  15. SDRAM内存驱动 的学习
  16. 算法第3章上机实践报告
  17. 太棒了!快来领养一位你的虚拟女友冰冰吧
  18. 【SQL语法基础】数据过滤:SQL数据过滤都有哪些方法?
  19. Mysql 分库分表 Mycat
  20. UA OPTI544 量子光学1 Maxwell方程与Lorentz Oscillator回顾

热门文章

  1. GZIP,XZ,LZO,BZIP2,LZMA压缩比较
  2. c语言中char97,C语言数据类型char
  3. JavaScript判断对象中每一项属性都不为空
  4. Unity学习 — VideoPlayer控制视频播放、暂停、上下选择播放!
  5. timewait php,timewait是什么意思
  6. 第R1周:RNN-心脏病预测
  7. 排列数与组合数~~~~
  8. react合并单元格
  9. Server2008如何卸载MySQL_Sql Server 2008完全卸载方法(其他版本类似)
  10. 不合格高校教师的自我总结(学生评价和思考反省)