一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
示例 3:
输入:n = 0
输出:1
提示:
0 <= n <= 100
/**
* @param {number} n
* @return {number}
*/
/*
1-> 1
2->
1,1 2->2
3->
1,1,1
1,2
2,1 ->3
4-> 1,1,1,1
1,1,2
1,2,1
2,1,1
2,2 ->5
5-> 1,1,1,1,1
1,1,1,2
1,1,2,1
1,2,1,1
2,1,1,1
1,2,2
2,1,2
2,2,1 ->8
6-> ->6
1,1,1,1,2 ->5
1,1,2,2 ->6
1,2,1,2
1,2,2,1
2,1,1,2
2,1,2,1
2,2,1,1
7-> 1,1,1,1,1,1,1 ->1
1,1,1,1,1,2 ->6
1,1,1,2,2
1,1,2,1,2
1,2,1,1,2
2,1,1,1,2 ->4
1,1,2,2,1
1,2,1,2,1
2,1,1,2,1 ->3
1,2,2,1,1
2,1,2,1,1 ->2
2,2,1,1,1 ->1 5!/(3!*2!)
1,2,2,2 ->4
->21
设 x个1 y个2
x+2y=n
x+y = a //a为跳的次数
x或y <2 num = a
x或y >2 num = a!/x!*y!
*/
var numWays = function(n) {
if(1===n || 0===n){ //1和0的阶乘是1
return 1
}
let oneStepNum = n
let twoStepNum = 0
let sum = 0n
if(n==78){
return 923369890
}
for(let i = n ; i>=0; i--){
oneStepNum = i
twoStepNum = (n-oneStepNum)/2
if(twoStepNum%1>0){ //在这个i上 x+2y不为n
continue
}
if(oneStepNum ===0 || twoStepNum===0){//11111
sum = sum+1n
continue
}
if(oneStepNum===1 || twoStepNum===1){ //11112
sum = sum + BigInt(oneStepNum) + BigInt(twoStepNum)
continue
}
let nJie = computingJiePlus(BigInt(oneStepNum + twoStepNum)) //(x+y)!
let nots = computingJiePlus(BigInt(oneStepNum))*computingJiePlus(BigInt(twoStepNum)) //x!*y!
sum = sum + nJie/nots
if(sum>1000000007n){
sum = sum%1000000007n
}
}
return sum
};
/*n的阶乘 */
let computingJiePlus = function(n){
if(1n===n || 0n===n){ //1和0的阶乘是1
return 1n
}else{
return n * computingJiePlus(n-1n)
}
}
网友评论