Problem: Let's define the function f of multiset a as the multiset of number of occurences of every number, that is present in a.

E.g., f(\{5, 5, 1, 2, 5, 2, 3, 3, 9, 5\}) = \{1, 1, 2, 2, 4\}.

Let's define f^k(a), as applying f to array a k times: f^k(a) = f(f^{k-1}(a)), f^0(a) = a. 

E.g., f^2(\{5, 5, 1, 2, 5, 2, 3, 3, 9, 5\}) = \{1, 2, 2\}.

You are given integers n, k and you are asked how many different values the function f^k(a) can have, where a is arbitrary non-empty array with numbers of size no more than n. Print the answer modulo 998 244 353.

Input

The first and only line of input consists of two integers n, k (1 ≤ n, k ≤ 2020).

Output

Print one number — the number of different values of function f^k(a) on all possible non-empty arrays with no more than n elements modulo 998 244 353.

Examples

Input


3 1


Output


6


Input


5 6


Output


1


Input


10 1


Output


138


Input


10 2


Output


33

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
const int Mod = 998244353;
const int MN = 2025;
inline void Add(int &x, int y) { x -= (x += y) >= Mod ? Mod : 0; }
int N, K;
void Solve1() {
  static int Arr[MN], Tmp[MN];
  Arr[0] = Tmp[0] = 1;
  for (int i = 1; i * i <= N; ++i) {
    for (int rep = 0; rep < 2; ++rep)
      for (int j = i; j <= N - i * i; ++j) Add(Tmp[j], Tmp[j - i]);
    for (int j = i * i; j <= N; ++j) Add(Arr[j], Tmp[j - i * i]);
  }
  int Ans = 0;
  for (int i = 1; i <= N; ++i) Add(Ans, Arr[i]);
  printf("%d\n", Ans);
}
int f[MN][MN], g[MN][MN];
void Solve2() {
  int Ans = N;
  for (int i = 1; i <= N; ++i) f[i][i] = 1;
  for (int i = 2, s = 3; s <= N; s += ++i) {
    for (int j = N / (s - i); j > 1; --j)
      for (int k = (s - i) * j; k <= N; ++k) Add(f[j - 1][k], f[j][k]);
    for (int j = 1; s * j <= N; ++j)
      for (int k = s * j; k <= N; ++k) Add(Ans, g[j][k] = f[j][k - i * j]);
    std::swap(f, g);
  }
  printf("%d\n", Ans);
}
int Ans, stk[MN], tp;
std::vector<int> arr1, arr2;
inline bool chk() {
  arr1.clear();
  for (int i = 1; i <= tp; ++i) arr1.push_back(stk[i]);
  for (int t = 1; t < K; ++t) {
    int sum = 0;
    for (int x : arr1) sum += x;
    if (sum > N) return 0;
    arr2.clear();
    int i = arr1.size();
    for (int x : arr1) {
      while (x--) arr2.push_back(i);
      --i;
    }
    std::reverse(arr2.begin(), arr2.end());
    std::swap(arr1, arr2);
  }
  int sum = 0;
  for (int x : arr1) sum += x;
  if (sum > N) return 0;
  return ++Ans, 1;
}
bool DFS(int sum, int mx) {
  if (sum && !chk()) return 0;
  for (int i = mx; i <= N - sum; ++i) {
    stk[++tp] = i;
    bool d = DFS(sum + i, i);
    --tp;
    if (!d) break;
  }
  return 1;
}
void Solve3() {
  DFS(0, 1);
  printf("%d\n", Ans);
}
int main() {
  scanf("%d%d", &N, &K);
  if (K == 1)
    Solve1();
  else if (K == 2)
    Solve2();
  else if (K >= 9)
    puts("1");
  else
    Solve3();
  return 0;
}