// very important, much wow, such don't touch this
#define protected public
#define iii int
#define yeee iii

#ifdef LOCAL
const iii DEBUG = 10;
#else
const iii DEBUG = -1;
#endif
#define DBG(x) if(DEBUG >= x)

#include <bits/stdc++.h>
using namespace std;

#define FOR(i, lo, hi) for(ll i = ll(lo); i < ll(hi); ++i)
#define FOB(i, hi, lo) for(ll i = ll(hi); i >= (ll)(lo); --i)
#define all(x) (x).begin(), (x).end()
#define len(x) ll((x).size())
#define pb(x) push_back(x)
#define apply(f, x, y) (x) = f((x), (y))

// clang-format off
typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pll; typedef vector<bool> vb; typedef vector<vb> vvb; typedef vector<ll> vll; typedef vector<vll> vvll; typedef vector<pll> vpll;
typedef complex<ll> point;
template <class T> T get() { T x; cin >> x; return x; } template <class T1, class T2> ostream &operator<<(ostream &out, const pair<T1, T2> &cont) { out << "(" << cont.first << ", " << cont.second << ")"; return out; } template <class T> ostream &operator<<(ostream &out, const vector<T> &cont) { for(long long i=0; i < ll(cont.size()); ++i) out << (i ? " " : "") << cont[i]; return out; } template <class T> ostream &operator<<(ostream &out, const set<T> &cont) { out << "{"; for(const T &x : cont) out << x << ", "; out << "}"; return out; } template <class T, class U> ostream &operator<<(ostream &out, const map<T, U> &cont) { out << "{"; for(const pair<T, U> &x : cont) out << "(" << x.first << ": " << x.second << "), "; out << "}"; return out; }
void setup_io(string input_file = "", string output_file = "") { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); srand(unsigned(time(0))); DBG(0 && input_file != "") freopen(input_file.c_str(), "r", stdin); DBG(0 && output_file != "") freopen(output_file.c_str(), "w", stdout); }
std::chrono::_V2::system_clock::time_point get_time() { return chrono::high_resolution_clock::now(); } ld get_duration(std::chrono::_V2::system_clock::time_point start_time, std::chrono::_V2::system_clock::time_point end_time) { return ld(chrono::duration_cast<chrono::nanoseconds>(end_time - start_time).count()) / 1e9; }
ll sign(ld x) { return (x > 0) - (x < 0); }
auto START_TIME = get_time(); const long long INF = LONG_LONG_MAX / 3;
// clang-format on

void add_mod(ll &x, ll y, ll mod) {
    x += y;
    if(x >= mod)
        x -= mod;
}

yeee main() {
    setup_io();
    //

    ll MOD = 998244353;

    ll N, K;
    cin >> N >> K;

    // total length, length of current, length of max
    vector<vvll> D(2, vvll(N + 1, vll(N + 1, 0)));
    D[0][0][0] = 1;

    FOR(ii, 0, N) {
        ll i  = ii & 1;
        ll ni = i ^ 1;

        D[ni] = vvll(N + 1, vll(N + 1, 0));

        FOR(j, 0, N) {
            FOR(k, 0, N) {
                if(D[i][j][k] == 0)
                    continue;
                add_mod(D[ni][j + 1][max(k, j + 1)], D[i][j][k], MOD);
                add_mod(D[ni][1][max(k, 1ll)], D[i][j][k], MOD);
            }
        }
    }

    vll cat(N + 1, 0);
    FOR(j, 0, N + 1)
        FOR(k, 0, N + 1)
            add_mod(cat[k], D[N & 1][j][k], MOD);

    vll pref(N + 1, 0);
    FOR(i, 1, N + 1) {
        pref[i] = pref[i - 1];
        add_mod(pref[i], cat[i], MOD);
    }

    ll res = 0;
    FOR(i, 1, N + 1)
        add_mod(res, pref[min(N, (K - 1) / i)], MOD);

    res = (res * ((MOD + 1) / 2)) % MOD;
    cout << res << endl;
}
