在玩电脑游戏“Lucky Luke”时,Bom到达了一个场景,Lucky必须爬上一个由n个台阶组成的楼梯。
楼梯从下到上编号为1到n。 Lucky可能会往上爬一步,或者可能一次跳两步。 然而,一些台阶被打破了,Lucky不能站在上面。 一开始,Lucky站在第一阶(第一阶永远不会破)。
突然,Bom想到了一个问题:Lucky爬楼梯到第n阶楼梯有多少种方法?
Bom需要你的帮助来回答这个问题。
输入
第一行由两个整数n和k组成;
n是楼梯的阶数,k是破碎的阶梯个数(0≤k<n≤100000)
第二行由k个整数组成,表示破碎的阶梯的阶数。
输出
输出的结果如题目描述,因为结果可能很大,所以最终输出的结果对14062008取余。
Input
4 2
2 3
Output
0
Input
90000 1
49000
Output
楼梯从下到上编号为1到n。 Lucky可能会往上爬一步,或者可能一次跳两步。 然而,一些台阶被打破了,Lucky不能站在上面。 一开始,Lucky站在第一阶(第一阶永远不会破)。
突然,Bom想到了一个问题:Lucky爬楼梯到第n阶楼梯有多少种方法?
Bom需要你的帮助来回答这个问题。
输入
第一行由两个整数n和k组成;
n是楼梯的阶数,k是破碎的阶梯个数(0≤k<n≤100000)
第二行由k个整数组成,表示破碎的阶梯的阶数。
输出
输出的结果如题目描述,因为结果可能很大,所以最终输出的结果对14062008取余。
Input
4 2
2 3
Output
0
Input
90000 1
49000
Output
4108266
题意:…………
思路:初值条件:dp【1】=1;
递归方程:dp[i]=dp[i-1]+dp[i-2];
注意范围long long,用一个数组标记坏掉的阶梯,令他的dp值为0;
下面附上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=100005;
#define MOD 14062008
ll dp[MAX];
bool sa[MAX];
int main()
{
ll n,k,a;
scanf("%lld %lld",&n,&k);
for(ll i=1;i<=k;i++)
{
scanf("%lld",&a);
sa[a]=1;
}
for(ll i=1;i<=n;i++)
{
if(i==1) dp[i]=1;
else{
if(sa[i-1]) dp[i-1]=0;
if(sa[i-2]) dp[i-2]=0;
dp[i]=(dp[i-1]+dp[i-2])%MOD;
}
}
printf("%lld\n",dp[n]);
return 0;
}