牛客4432题:利用矩阵快速幂将爬楼梯问题优化到O(log n)

一、问题解析
该题是经典爬楼梯问题变种:每次可跨1或2阶台阶,求到达第n阶的方法数(结果模1000000007)。传统动态规划解法时间复杂度为O(n),而本题通过矩阵快速幂可将复杂度优化至O(log n)。
二、完整代码
class GoUpstairs {
public:// 主计算方法:输入台阶数n,返回爬楼方式数
int countWays(int n) {
if(n <= 0) return 0;// 边界处理
if(n == 1) return 1;// 1阶只有1种方式
if(n == 2) return 2;// 2阶有(1+1)或(2)两种方式
// 构建转移矩阵
vector<vector<long>> mat = {{1,1}, {1,0}};
vector<vector<long>> res = matrixPower(mat, n-2);// 计算矩阵的(n-2)次幂
//结果推导公式:f(n) = 2*res[0][0] + res[1][0]
return (2*res[0][0] + res[1][0]) % 1000000007;// 2x2矩阵乘法(含模运算)
}
vector<vector<long>> matrixMultiply(vector<vector<long>>& a, vector<vector<long>>& b) {
vector<vector<long>> res(2, vector<long>(2));
// 矩阵乘法标准公式实现
res[0][0] = (a[0][0]*b[0][0] + a[0][1]*b[1][0]) % 1000000007;
res[0][1] = (a[0][0]*b[0][1] + a[0][1]*b[1][1]) % 1000000007;
res[1][0] = (a[1][0]*b[0][0] + a[1][1]*b[1][0]) % 1000000007;
res[1][1] = (a[1][0]*b[0][1] + a[1][1]*b[1][1]) % 1000000007;
return res;
}
// 矩阵快速幂算法(时间复杂度O(log p)
vector<vector<long>> matrixPower(vector<vector<long>>& mat, int p) {
vector<vector<long>> res = {{1,0}, {0,1}};
while(p > 0) {
if(p & 1) res = matrixMultiply(res, mat);// 当前二进制位为1时累乘
mat = matrixMultiply(mat, mat);// 矩阵平方
p >>= 1;// 右移一位
}
return res;
}
};三、核心原理
原创内容 转载请注明出处
