题目描述
自古华山一条路,华山一直是小 z 向往的地方。我们知道,华山共有 n 个台阶,小 z 一步可以跨 1 个、2 个或者 3 个台阶,请你输出小 z 最终爬到山顶的方案数。小 z 想,非 常简单,直接递推即可,但是小 y 突然走到小 z 面前,得意的说:“小 z,我在 m 个台阶上 分别放了陷阱,这些台阶是不能踏上去的,请你输出方案数”。由于方案数会很大,所以答 案需要模 100003。聪明的小 z 怎么会被难倒,他自然知道做法,但是他把问题交给了你, 因为他要去处理损友小 y。若无法走到,则输出-1。
输入格式
一行两个数 n 和 m,空格隔开。接下来的1行,共m个数字,表示放置陷阱的台阶位置。m< n <1000。
输出格式
每组测试数据的方案数 。
样例
input
5 1
4
output*
6
AC代码:
#include<bits/stdc++.h>
using namespace std;
int f[1005];
bool b[1005];
int main(){
int m,n,x,mod=100003;
cin>>n>>m;
for(int i=0;i<=m;i++){
cin>>x;
b[x]=1;
}
f[0]=1;
for(int i=1;i<=n;i++)
if(!b[i])
for(int j=max(0,i-3);j<i;j++)
f[i]=(f[i]+f[j])%mod;
if(f[n]==0) f[n]=-1;
cout<<f[n]<<endl;
return 0;
}