description: You are given a binary string (i. e. a string consisting of characters 0 and/or 1) s of length n. You can perform the following operation with the string s at most once: choose a substring (a contiguous subsequence) of s having exactly k characters 1 in it, and shuffle it (reorder the characters in the substring as you wish).
  
  Calculate the number of different strings which can be obtained from s by performing this operation at most once.
  
  Input
  
  The first line contains two integers n and k (2 ≤ n ≤ 5000; 0 ≤ k ≤ n).
  
  The second line contains the string s of length n, consisting of characters 0 and/or 1.
  
  Output
  
  Print one integer — the number of different strings which can be obtained from s by performing the described operation at most once. Since the answer can be large, output it modulo 998244353.
  
  Examples
  
  Input
  
  
  7 2
  1100110
  
  
  Output
  
  
  16
  
  
  Input
  
  
  5 0
  10010
  
  
  Output
  
  
  1
  
  
  Input
  
  
  8 1
  10001000
  
  
  Output
  
  
  10
  
  
  Input
  
  
  10 8
  0010011000
  
  
  Output
  
  
  1
  
  Note
  
  Some strings you can obtain in the first example:
  
    * to obtain 0110110, you can take the substring from the 1-st character to the 4-th character, which is 1100, and reorder its characters to get 0110; 
    * to obtain 1111000, you can take the substring from the 3-rd character to the 7-th character, which is 00110, and reorder its characters to get 11000; 
    * to obtain 1100101, you can take the substring from the 5-th character to the 7-th character, which is 110, and reorder its characters to get 101. 
  
  
  
  In the second example, k = 0 so you can only choose the substrings consisting only of 0 characters. Reordering them doesn't change the string at all, so the only string you can obtain is 10010.
solution: import io, os, sys
  input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline
  
  MOD, M = 998244353, 5002
  F = [1]*(M+1)
  for i in range(1, M+1):
      F[i] = (F[i-1] * i) % MOD
  
  I = [1]*M + [pow(F[M], MOD - 2, MOD)]
  for i in range(M-1, 0, -1):
      I[i] = I[i+1]*(i+1) % MOD
  
  
  def C(a, b):
      return (F[a]*I[b]*I[a-b]) % MOD
  
  
  if __name__ == '__main__':
      n, k = [int(i) for i in input().split()]
      s = [int(i) for i in input().rstrip()]
      ans = 0
      if k == 0 or s.count(1) < k:
          print(1)
      else:
          acc = [0]*(n+1)
          for i in range(1, n+1):
              acc[i] = acc[i-1] + s[i-1]
  
          for t in range(1, n + 1):  # real change
              for p in range(0, n - t + 1):
                  p1 = s[p]
                  p2 = s[p + t - 1]
                  total = acc[p + t] - acc[p]
                  if (acc[p + t] + acc[-1] - acc[p] >= k) and total <= k:
                      if p1 != p2:
                          ans += C(t - 2, total - 1)
                          ans %= MOD
                      elif p1 == p2 and p1 == 1:
                          if total <= t - 2:
                              ans += C(t - 2, total)
                              ans %= MOD
                      else:
                          if total >= 2:
                              ans += C(t - 2, total - 2)
                              ans %= MOD
  
          print((ans + 1) % MOD)