新生邀请赛A
题目描述
madoka的面前有n级台阶,目前她处于第0级台阶,她每一次可以选择选择爬一级台阶或是连爬两级台阶,madoka想知道她有几种到达第n级台阶的走法。出乎意料的是,n级台阶中有k级台阶被损坏了,madoka无法抵达这些被损坏的台阶。
输入
第一行输入一个正整数T,表示测试样例数。
对于每个测试样例,共两行,第一行给出两个正整数n,k,表示台阶的级数以及损坏的台阶数。
第二行给出k个正整数ai,表示第ai级台阶被损坏。
1 <= T <= 10
1 <= n <= 105
1 <= k,ai <= n输出
对于每个测试样例,输出一个正整数,表示madoka到达第n级台阶的方法数。
答案对1000000007取模。样例输入 Copy
2 3 1 1 3 3 1 2 3样例输出 Copy
1 0
#include <iostream>
#include <cstring>
using namespace std;
int a[100010],o[100010];//a用来存方法数 o用来存坏的台阶
int main()
{
int t;
cin >> t;
while(t--)
{
memset(a,0,sizeof a);//一定要数组清零 记得加头文件
memset(o,0,sizeof o);
int n,k,num=0;
cin >> n >> k;
while(k--)
{
int l;
cin >> l;
o[l]=1;//将所有的坏的台阶都标记
}
a[0]=1;//类似斐波那契 得先定义一个数然后递推
for(int i=1;i<=n;i++)
{
if(o[i]>0) continue;//遇见坏台阶就跳过
else a[i]=a[i-1]+a[i-2];//跳台阶推导
a[i]%=1000000007;
}
cout << a[n] << endl;
}
}