#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;   }   