#include using namespace std; typedef long long ll; const int mod = 998244353; typedef tuple T; ll answer(vector &a, vector &b, int k){ ll ret = 0; for (int i=0; i addone(vector &a, int x, int k){ vector ret = a; for (int i=0; i &a, vector &q, vector &ans, vector> &dp){ dp[mid] = vector(k); dp[mid][0] = 1; for (int i=mid-1; i>=l; i--){ dp[i] = addone(dp[i+1], a[i], k); } for (int i=mid+1; i<=r; i++){ dp[i] = addone(dp[i-1], a[i-1], k); } for (auto [ind, l, r]: q){ ans[ind] = (answer(dp[l], dp[r], k) - 1 + mod) % mod; } } void gogo(int l, int r, int k, vector &a, vector &q, vector &ans, vector> &dp){ if (r-l <= 1){ for (auto [ind, l, r]: q){ if (a[l] == 0) ans[ind] = (ll)1; else ans[ind] = (ll)0; } return; } int mid = (l + r) / 2; vector gocalc, lquery, rquery; for (auto [ind, l, r]: q){ if (mid <= l) rquery.push_back(make_tuple(ind, l, r)); else if (r <= mid) lquery.push_back(make_tuple(ind, l, r)); else gocalc.push_back(make_tuple(ind, l, r)); } calc(l, r, mid, k, a, gocalc, ans, dp); gogo(l, mid, k, a, lquery, ans, dp); gogo(mid, r, k, a, rquery, ans, dp); return; } int main(){ int n, m, k; cin >> n >> m >> k; vector a(n); vector> dp(n+1, vector(k)); for (int i=0; i> a[i]; } int qnum = n-m+1; vector q(qnum); vector ans(qnum); for (int i=0; i