小明很喜欢爬楼梯,这一次,他获得了一个特异功能,每次可以跳跃任意奇数的阶梯。比如他初始在楼底,跨越一个阶梯到达 1 号阶梯,或者跨越 3 个楼梯到达 3 号阶梯。
为了选出一种最轻松的爬楼梯的方式,小明想把所有不同的到达楼顶的方式都尝试一遍。对于一共有 n 个阶梯的楼梯,小明一共有多少总方法从楼底到达楼顶。
由于最后答案可能很大,输出最后的答案对 100007 取模的结果。
输入格式
第一行输入一个整数 n(1≤n≤1000)。
输出格式
输出最后答案对于 100007 取模的结果。
第一种题解
每层楼梯方式数量
- 1
- 1
- 2
- 3
- 5
- 18
.......
由此可推出a[i]=a[1]+a[3]+a[5]+...;
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main(){
int n;
cin>>n;
a[0]=1;
a[1]=1;
a[2]=1;
a[3]=2;
for(int i=4;i<=n;i++){
for(int j=1;i-j>=0;j+=2){
a[i]+=(a[i-j]%100007);
}
}
cout<<a[n]%100007;
return 0;
}
第2种题解
每层楼梯方式数量
- 1
- 1
- 3
- 5
- 8
- 13
.......
由此可推出该数列是一个斐波那契数列(a[i]=a[i-1]+a[i-2]);
AC代码
#include<bits/stdc++.h>
using namespace std;
int a[1001];
int main(){
int n;
cin>>n;
a[1]=1;
a[2]=1;
for(int i=3;i<=n;i++){
a[i]=(a[i-1]+a[i-2])%100007;
}
cout<<a[n]%100007;
return 0;
}