概述
/*
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。
求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
*/
class Solution {
public:
int MOD = int(1e9 + 7);
int numWays(int n) {
if (n < 2)
{
return 1;
}
vector<vector<long>> M = { {1,1}, {1,0} };
vector<vector<long>> ret = pow(M, n-1);
return (ret[0][0]+ ret[0][1]) % MOD;
}
vector<vector<long>> pow(vector<vector<long>>&M, int n)
{
vector<vector<long>> ret = { {1,0},{0,1} };
while (n > 0) {
if (n & 1) {
ret = Multiply(ret, M) ;
}
n >>= 1;
M = Multiply(M, M);
}
return ret;
}
vector<vector<long>> Multiply(vector<vector<long>>& a, vector<vector<long>>& b)
{
vector< vector<long>> c = { {0,0},{0,0} };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) ;
c[i][j] = c[i][j] % MOD;
}
}
return c;
}
};
青蛙跳台阶问题使用矩阵快速幂取余的位置相对于斐波那契数列应该有两处:
1、在执行矩阵乘法时,对返回结果的每个元素取余,避免数字过大。
2、在返回最后的结果时不同于斐波那契数列只返回ret[0][0]项,因为初始值不同(f(0)=1,f(1)=1)返回ret[0][0]+ret[0][1],此时两数之和很有可能超过MOD,因此需要再取一次余数。
因为我的代码执行到44这个数字才出错,就找了很久的原因。最后发现应该对最后的结果再取一次余数。
最后
以上就是勤恳灯泡为你收集整理的剑指 Offer 10- II. 青蛙跳台阶问题使用矩阵快速幂时取余的问题(C++)的全部内容,希望文章能够帮你解决剑指 Offer 10- II. 青蛙跳台阶问题使用矩阵快速幂时取余的问题(C++)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复