Appearance
简介
矩阵快速幂能将
矩阵
矩阵相当于二维数组。
- 矩阵
有 行 列,称为 矩阵,简记为 ; - 矩阵
第 行 列的元素写作 。
单位矩阵
主对角线上的元素都为
矩阵加减法
矩阵的加减法就是将两个矩阵对应位置上的元素相加减。
矩阵乘法
定义矩阵
- 必须满足
的列数 的行数; 会得到一个 矩阵 ; 的每个元素为
任意矩阵乘
- 矩阵乘法满足结合律,不满足交换律;
- 只有行数和列数相等的矩阵才能进行乘幂运算。
矩阵快速幂
基于 快速幂 的思想求
矩阵运算可能需要 高精度 或取模。
cpp
const int N = 101; // 矩阵的行数和列数
struct matrix {
int at[N][N];
matrix() { memset(at, 0, sizeof at); }
int* operator[](int key) { return at[key]; }
};
matrix operator *(matrix a, matrix b) { // 矩阵 A × 矩阵 B
matrix c;
for (int i = 0; i < N; i ++)
for (int j = 0; j < N; j ++)
for (int k = 0; k < N; k ++)
c[i][j] += a[i][k] * b[k][j];
return c;
}
matrix operator ^(matrix a, int x) { // 矩阵 A 的 x 次方
matrix res;
for (int i = 0; i < N; i ++) // 初始化为单位矩阵
res[i][i] = 1;
while(x) {
if(x % 2) res = res * a;
a = a * a, x /= 2;
}
return res;
}
应用
若已知
就可以推出
可用矩阵快速幂求
例 1
求斐波那契数列的第
设矩阵
即
解得
因此
将
cpp
int main() {
matrix A;
A[1][1] = 1, A[1][2] = 1;
A[2][1] = 1, A[2][2] = 0;
matrix B;
B[1][1] = 1; // f(1) = 1
B[2][1] = 1; // f(2) = 1
cin >> n;
B = (A ^ (n - 2)) * B;
cout << B[1][1];
}
例 2
求数列的第
设
解得