题目描述
现在有一栋高楼,但是电梯却出了故障,无奈的你只能走楼梯上楼,根据你的腿长,你一次能走1级或2级楼梯,已知你要走n级楼梯才能走到你的目的楼层,请计算你走到目的楼层的方案数,由于楼很高,所以n的范围为int范围内的正整数。
给定楼梯总数n,请返回方案数。为了防止溢出,请返回结果Mod 1000000007的值。
测试样例:
3
返回:3
使用快速幂运算的算法原理实现斐波那契数列在O(logn)的时间复杂度。
class GoUpstairs {
public:
vector<vector<long long>> mul(vector<vector<long long>> A, vector<vector<long long>> B)
{
vector<vector<long long>> ans(2, vector<long long>(2, 0));
for(int i = 0;i<2;i++)
for (int j = 0; j < 2; j++)
{
ans[i][j] = (A[i][0] * B[0][j] + A[i][1] * B[1][j]) % 1000000007;
}
return ans;
}
int countWays(int n) {
// write code here
vector<vector<long long>> base(2, vector<long long>(2, 1));
vector<vector<long long>> ans(2, vector<long long>(2, 1));
ans[0][1] = 0;
ans[1][0] = 0;
base[1][1] = 0;
int exp = n ;
while (exp)
{
if (exp & 1)
ans = mul(ans, base);
exp = exp / 2;
base = mul(base, base);
}
vector<vector<long long>> begin(2, vector<long long>(2, 0));
begin[0][0] = 1;
begin[0][1] = 1;
ans = mul(ans, begin);
return (int)ans[0][0];
}
};