#include <bits/stdc++.h>
using namespace std;
double const EPS = 1.0E-9;
int const MOD = (int)1e9 + 7;
inline int read(char* s) { return scanf("%s", s); }
inline int read(int& x) { return scanf("%d", &(x)); }
inline int read(long long& x) { return scanf("%lld", &x); }
inline int read(double& x) { return scanf("%lf", &x); }
inline int write(int x) { return printf("%d", x); }
inline int write(long long x) { return printf("%lld", x); }
inline int write(double x) { return printf("%.12f", x); }
inline int write(char c) { putchar(c); }
inline int write() { return 0; }
inline int write(const char* s) { return printf("%s", s); }
inline int write(std::string const& s) { return write(s.c_str()); }
template <typename T>
int write(std::vector<T> const& v) {
  int z = v.size();
  for (int i = (0), vzq_b = (z - 1); i < vzq_b; ++i) {
    write(v[i]);
    write(' ');
  }
  if (z > 0) write(v[z - 1]);
  return z;
}
template <typename... T>
int read(T&... args) {
  using swallow = int[];
  swallow w = {0, (read(args))...};
  return sizeof(w) / sizeof(w[0]) - 1;
}
template <typename T>
int read(std::vector<T>& v) {
  for (T& t : v) read(t);
  return v.size();
}
template <typename... T>
int write(T const&... args) {
  using swallow = int[];
  swallow w = {0, (write(args), write(' '))...};
  return sizeof(w) / sizeof(w[0]) - 1;
}
template <typename... T>
int writeln(T const&... args) {
  int r = write(args...);
  printf("\n");
  return r + 1;
}
inline long long gcd(long long x, long long y) {
  return y == 0 ? x : gcd(y, x % y);
}
inline long long lcm(long long x, long long y) {
  return x == 0 && y == 0 ? 0 : x / gcd(x, y) * y;
}
inline long long powmod(long long x, long long n, long long m = MOD) {
  long long r = 1;
  while (n) {
    if (n & 1) r = (r * x) % m;
    x = (x * x) % m;
    n /= 2;
  }
  return r;
}
static int leap(int y) { return y % 4 == 0 && y % 100 != 0 || y % 400 == 0; }
static int const month[2][12] = {
    {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
int solve();
int main(int argc, char* argv[]) {
  solve();
  return 0;
}
static const int maxn = 505;
static const int maxm = 1 << 22;
static const int P = 998244353;
static const long long LL_INF = 1234567890123456789;
static int add(int a, int b) {
  a += b;
  if (a >= P) a -= P;
  return a;
}
static int mul(int a, int b) {
  long long r = 1ll * a * b;
  if (r >= P) r %= P;
  return r;
}
static int query(int l, int r, int arr[]) {
  if (l == 0) return arr[r];
  return (arr[r] - arr[l - 1] + P) % P;
}
int dp[maxn], dp2[maxn], pre[maxn];
int solve() {
  int n, k;
  read(n, k);
  dp[0] = 1;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      dp[j] = add(query(max(0, j - i), j - 1, dp), dp[j - 1]);
    }
    dp2[i] = query(n, n, dp);
  }
  for (int i = n; i > 0; --i) {
    dp2[i] = add(dp2[i], P - dp2[i - 1]);
  }
  long long ans = 0;
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      if (i * j < k) {
        ans = add(ans, mul(dp2[i], dp2[j]));
      }
    }
  }
  ans = add(ans, ans);
  writeln(ans);
  return 0;
}
