b站视频链接:北京理工大学ACM冬季培训课程
课程刷题地址 2020BIT冬训-二分三分快速幂矩阵快速幂 Password: bitacm2020
本篇博文为看视频学习时的记录与自己的一些总结
二分三分快速幂矩阵快速幂
¶二分法
- 思想简单,主要讲实现
- 写法多种多样
- lower_bound upper_bound(begin, end, val)
¶解决问题
- 具有单调性 / 连续性的问题二分查找
- 最大最小问题 / 最小最大问题二分答案
- 判断前缀的合法性二分前缀长度
- 分数规划问题二分答案
¶小数
- 规定精度 eps = 1e-6 or 1e-8
1 | double left, right, mid; |
¶二分答案
- 适用情况:求最值,可能答案区间有限且单调,检验答案合理性复杂度低
一个例子
如果一个数列中 2*K 的元素中前 K 个元素和与后 K 个元素和都不大于 S。那么我们说这些元素是有趣的。给定 S,给你一个长度为 N 的数列,求各个元素从本身开始能构成的最长有趣元素的长度。
二分答案的写法模板
1 | while (l <= r) |
【例】aggressive cows
-
有 n 个牛栏,分别位于 X1,X2,…Xn。选 m 个放进牛,使得相邻牛之间的最小距离值最大。
其中,m <= n <= 1e5,0 <= Xi <= 1e9 -
二分答案的标志:最小值最大 / 最大值最小
【例】Multiplication Table
-
有 n * m 乘法表,将 n * m 个数从小到大依次排列,第 K 个数是多少?
其中,K <= n, m <= 5e5 -
二分的过程很简单,重点是判断答案的合理性
¶三分法
-
二分:单调区间
-
三分:凸性函数
以求最大值为例
- 对比 f(lmid) 与 f(rmid)
- 若 f(lmid) < f(rmid) 那么区间变为 lmid ~ r
- 否则变为 l ~ rmid
(图解)
¶快速幂
-
求
-
a^{2i} = a^i \cdot a^i
快速求出 $a2,a4,a8,a{16} \dots 将 b 做二进制拆分 a^b = a^{b_1} \cdot a^{b_2} \cdot \dots \cdot a^{b_k}$ -
O(\log b)
¶代码实现
1 | int quickpow(int a, int p, int mod) |
¶矩阵快速幂
¶矩阵乘法
-
c_{ij} = \sum a_{ik} \times b_{kj}
-
第一个矩阵是 n \times m,第二个矩阵是 m \times p
-
O(nmp)
¶矩阵快速幂
-
将快速幂中的底数变为矩阵
-
优势:线性递推式
【例】斐波那契数列
- 求斐波那契数列的第 n 项,n <= 1e18
F_i = F_{i-1} + F_{i-2},F_1, F_0 = 1
\begin{pmatrix} 1 & 1 \ 1 & 0 \end{pmatrix} \times \begin{pmatrix} F_{i-1} \ F_{i-2} \end{pmatrix} = \begin{pmatrix} F_i \ F_{i-1} \end{pmatrix}
\begin{pmatrix} F_n \ F_{n-1} \end{pmatrix} = \begin{pmatrix} 1 & 1 \ 1 & 0 \end{pmatrix}^{n-1} \times \begin{pmatrix} F_1 \ F_0 \end{pmatrix}
\begin{pmatrix} F_{i-2} & F_{i-1} \ a & b \end{pmatrix} \times \begin{pmatrix} 0 & 1 \ 1 & 1 \end{pmatrix} = \begin{pmatrix} F_{i-2} & F_{i-1} \ b & a + b \end{pmatrix}
¶一些递推式
推广,根据状态逆推系数矩阵
F_i = a * F_{i-1} + b * F_{i-2}
\begin{pmatrix} a & b \ 1 & 0 \end{pmatrix} \times \begin{pmatrix} F_{i-1} \ F_{i-2} \end{pmatrix} = \begin{pmatrix} F_i \ F_{i-1} \end{pmatrix}
\begin{pmatrix} F_n \ F_{n-1} \end{pmatrix} = \begin{pmatrix} a & b \ 1 & 0 \end{pmatrix}^{n-1} \times \begin{pmatrix} F_1 \ F_0 \end{pmatrix}
F_i = a * F_{i-1} + i
\begin{pmatrix} a & 1 & 1 \ 0 & 1 & 1 \ 0 & 0 & 1 \end{pmatrix} \times \begin{pmatrix} F_{i-1} \ i-1 \ 1 \end{pmatrix} = \begin{pmatrix} F_i \ i \ 1 \end{pmatrix}
Be the first person to leave a comment!