爬台阶

题目描述

楼上有 nn 级台阶,其中有 mm 级台阶是不安全的。yhf一开始站在第 00 级台阶上,希望最终走到第 nn 级台阶

yhf跨一步满足以下约束:

  • 只能向前走
  • 不能落脚在不安全的台阶上
  • 最多迈 kk 级台阶
  • 落脚点不能超过第 nn 级台阶

也就是说,若某一刻yhf站在第 cc 级台阶上,那么他下一步可以落脚的位置 xx 满足 c<xmin(c+k,n)c < x \le min(c + k, n) 且第 xx 级台阶是安全的。那么,yhf有多少种方法走到第 nn 级台阶

爬台阶

输入格式

第一行三个整数 n,m,kn, m, k ,描述见上文

第二行 mm 个整数,d1,d2,...,dmd_1, d_2 ,...,d_m ,其中 1di<n1 \le d_i < n ,表示不安全台阶的编号

输出格式

一个整数,模 998244353998244353 后的方案数

测试样例

样例输入

5 1 2
3

样例输出

2

数据规模

对于 100%100 \% 的数据,1m<n106,1k1061 \le m < n \le 10^6, 1 \le k \le 10^6

#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;
}