快速幂

设置矩阵A为$m\times p$的矩阵,B为$p \times n$的矩阵,则可有$m \times n$的矩阵c为矩阵AB的乘积。

例如

接下来我们使用矩阵快速幂解决斐波那契问题

我们将斐波那契数列相邻的两项表示为一个矩阵

我们希望通过$\left[\begin{array}{b}F{n-1}&F{n-2}\\end{array}\right]$推出$\left[\begin{array}{b}F{n}&F{n-1}\\end{array}\right]$

尝试构造一个矩阵A使得$\left[\begin{array}{b}F{n-1}&F{n-2}\\end{array}\right]\times=\left[\begin{array}{b}F{n}&F{n-1}\\end{array}\right]$。

发现$A = \left[\begin{array}{b}1&1\1&0\\end{array}\right]$

那么

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

using ll = long long;
using namespace std;
struct matrix{
ll c[3][3];
matrix() { memset(c, 0, sizeof c); }
}F,A;
matrix operator*(matrix& a, matrix& b) {
matrix t;
for (int i = 1; i <= 2; i++) {
for (int j = 1; j <= 2; j++) {
for (int k; k <= 2; k++) {
t.c[i][j] = (t.c[i][j] + a.c[i][k] * b.c[k][j]) % mod;
}
}
}
return t;
}
void quickpow(ll n) {
F.c[1][1] = F.c[1][2] = 1;
A.c[1][1] = A.c[1][2] = A.c[2][1] = 1;
while (n) {
if (n & 1) F = F * A;
A = A * A;
n >>= 1;
}
}




快速幂
http://example.com/2024/06/07/矩阵快速幂/
作者
wangzj
发布于
2024年6月7日
许可协议