矩阵快速幂
概念讲解
核心思想
用矩阵表示线性递推关系,用快速幂加速计算。
矩阵乘法
1234567891011121314struct Matrix {
long long a[2][2];
Matrix operator*(const Matrix& other) const {
Matrix result = {{{0,0},{0,0}}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 2; k++) {
result.a[i][j] += a[i][k] * other.a[k][j];
}
}
}
return result;
}
};矩阵快速幂
123456789Matrix matrixPower(Matrix base, long long n) {
Matrix result = {{{1,0},{0,1}}}; // 单位矩阵
while (n > 0) {
if (n & 1) result = result * base;
base = base * base;
n >>= 1;
}
return result;
}应用
斐波那契数列
123Matrix base = {{{1,1},{1,0}}};
Matrix result = matrixPower(base, n);
return result.a[0][1]; // F(n)时间复杂度:
考点分析
初赛考查方式
- 程序阅读: 矩阵快速幂
- 编程题: 递推优化
常见考点
- 矩阵乘法
- 矩阵快速幂
- 构造转移矩阵
例题精讲
例题 1:斐波那契
题目: 求第 n 个斐波那契数。
解答:
使用矩阵快速幂,时间复杂度 O(log n)。
练习题
- 矩阵快速幂的时间复杂度是多少?
查看答案
- k 是矩阵的大小
- n 是幂次
- 每次矩阵乘法:
- 快速幂:
对于斐波那契数列,k=2,所以是 。
- 如何构造转移矩阵?
查看答案
构造转移矩阵的方法:
- 确定状态向量:将递推关系中的变量组成向量
- 找出转移关系:用矩阵表示状态之间的转移
- 验证:用小数据验证矩阵是否正确
例如斐波那契:
- 矩阵乘法满足交换律吗?
查看答案
不满足
(一般情况下)
所以计算时要注意顺序,不能随意交换。
易错点
⚠️ 注意:
- 矩阵乘法不满足交换律
- 单位矩阵是对角线为 1
- 要用 long long 防溢出
- 构造转移矩阵是关键