// Author: Tyler Wang

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

template <typename Key, typename T, typename Compare = std::less<Key>,
          typename Alloc = std::allocator<std::pair<const Key, T>>>
using tree_map =
    __gnu_pbds::tree<Key, T, Compare, __gnu_pbds::rb_tree_tag,
                     __gnu_pbds::tree_order_statistics_node_update, Alloc>;

template <typename Key, typename Compare = std::less<Key>,
          typename Alloc = std::allocator<Key>>
using tree_set = tree_map<Key, __gnu_pbds::null_type, Compare, Alloc>;

template <typename T1, typename T2>
std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2>& p) {
  return os << '(' << p.first << ", " << p.second << ')';
}

#define OVERLOAD_OSTREAM_INSERTION_OPERATOR_FOR_CONTAINER(Container)        \
  template <typename... Args>                                               \
  std::ostream& operator<<(std::ostream& os, const Container<Args...>& x) { \
    os << '{';                                                              \
    for (auto it = x.cbegin(); it != x.cend(); ++it) {                      \
      if (it != x.cbegin()) {                                               \
        os << ", ";                                                         \
      }                                                                     \
      os << *it;                                                            \
    }                                                                       \
    return os << '}';                                                       \
  }

OVERLOAD_OSTREAM_INSERTION_OPERATOR_FOR_CONTAINER(std::map)
OVERLOAD_OSTREAM_INSERTION_OPERATOR_FOR_CONTAINER(std::set)
OVERLOAD_OSTREAM_INSERTION_OPERATOR_FOR_CONTAINER(std::vector)

#define DEBUG(x) std::cerr << #x << " = " << x << '\n'

using namespace std;

const int kMod = 998244353;

inline void Add(int& a, int b) { a = ((long long)a + b) % kMod; }

inline int Mul(int a, int b) { return (long long)a * b % kMod; }

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cerr << boolalpha;
  int n, area;
  cin >> n >> area;
  vector<vector<vector<int>>> dp(
      2, vector<vector<int>>(n + 1, vector<int>(n + 1)));
  dp[0][0][0] = 1;
  for (int i = 0; i < n; ++i) {
    int cur = i & 1;
    int nxt = cur ^ 1;
    for (int j = 0; j <= i + 1; ++j) {
      for (int k = 0; k <= i + 1; ++k) {
        dp[nxt][j][k] = 0;
      }
    }
    for (int j = 0; j <= i; ++j) {
      for (int k = 0; k <= i; ++k) {
        Add(dp[nxt][j + 1][max(j + 1, k)], dp[cur][j][k]);
        Add(dp[nxt][1][max(1, k)], dp[cur][j][k]);
      }
    }
  }
  vector<int> cnt(n + 1);
  for (int j = 0; j <= n; ++j) {
    for (int k = 0; k <= n; ++k) {
      Add(cnt[k], dp[n & 1][j][k]);
    }
  }
  int ans = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (i * j < area) {
        Add(ans, Mul(cnt[i], cnt[j]));
      }
    }
  }
  if (ans & 1) {
    Add(ans, kMod);
  }
  ans /= 2;
  cout << ans << '\n';
  return 0;
}
