题目描述
楼上有 级台阶,其中有 级台阶是不安全的。yhf一开始站在第 级台阶上,希望最终走到第 级台阶
yhf跨一步满足以下约束:
- 只能向前走
- 不能落脚在不安全的台阶上
- 最多迈 级台阶
- 落脚点不能超过第 级台阶
也就是说,若某一刻yhf站在第 级台阶上,那么他下一步可以落脚的位置 满足 且第 级台阶是安全的。那么,yhf有多少种方法走到第 级台阶
输入格式
第一行三个整数 ,描述见上文
第二行 个整数, ,其中 ,表示不安全台阶的编号
输出格式
一个整数,模 后的方案数
测试样例
样例输入
5 1 2
3
样例输出
2
数据规模
对于 的数据,
#include <bits/stdc++.h>
using namespace std;
#define N 1000002
int sum[N], mod = 998244353, n, m, k, t;
bool d[N]; // 默认是false
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < m; ++i)
scanf("%d", &t), d[t] = true;
for (int i = 1; i <= n; ++i) {
t = 0;
if (!d[i]) {
if (i <= k)
t = (sum[i - 1] + 1 + mod) % mod;
else
t = (sum[i - 1] - sum[i - k - 1] + mod) % mod;
}
sum[i] = (t % mod + sum[i - 1]) % mod;
}
cout << (sum[n] - sum[n - 1] + mod) % mod;
}