#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
inline bool umin(T1& x, const T2& y) {
  return x > y ? x = y, true : false;
}
template <typename T1, typename T2>
inline bool umax(T1& x, const T2& y) {
  return x < y ? x = y, true : false;
}
const int N = (int)5e2 + 5;
const int INF = (int)1e9 + 17;
const long long LLINF = (long long)1e18 + 17;
const int mod = 998244353;
inline void add(int& x, int y) { x = (x + y >= mod ? x + y - mod : x + y); }
inline int mul(int x, int y) { return 1ll * x * y % mod; }
int n, m;
int cnt[N];
int nxt[N][N];
int prv[N][N];
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  cin >> n >> m;
  prv[0][0] = 1;
  for (int total = (0); total < (n); ++total) {
    for (int maxEqual = (0); maxEqual < (total + 1); ++maxEqual) {
      for (int equal = (0); equal < (total + 1); ++equal) {
        if (prv[maxEqual][equal] == 0) continue;
        add(nxt[max(maxEqual, equal + 1)][equal + 1], prv[maxEqual][equal]);
        add(nxt[max(maxEqual, 1)][1], prv[maxEqual][equal]);
      }
    }
    memcpy(prv, nxt, sizeof nxt);
    memset(nxt, 0, sizeof nxt);
  }
  for (int maxEqual = (0); maxEqual < (n + 1); ++maxEqual) {
    for (int equal = (0); equal < (maxEqual + 1); ++equal) {
      add(cnt[maxEqual], prv[maxEqual][equal]);
    }
  }
  int answer = 0;
  for (int a = (0); a < (n + 1); ++a)
    for (int b = (0); b < (n + 1); ++b) {
      if (a * b >= m) continue;
      add(answer, mul(cnt[a], cnt[b]));
    }
  if (answer % 2 == 0)
    answer /= 2;
  else
    answer = (answer + mod) / 2;
  cout << answer << endl;
  return 0;
}
