#include <iostream>
#include <vector>
#include <string>
#include <array>
#include <functional>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <climits>
#include <queue>
#include <bitset>
#include <cassert>
#include <math.h>
using namespace std;
#define ll long long
#define pb(x) push_back(x)
#ifdef _OLIMPOLOCAL
    #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
    #define debug(...) 1337
#endif
void debug_out() { cout << "\n";}
template<typename T1, typename... T2> void debug_out(T1 A, T2... B) { cout << " " << A; debug_out(B...); }
int test = 1;
#define MOD 998244353ll
//-------------------------- ^ DONT TOUCH ^-----------------------------------------------------------------
const int lm = 3001;
int n, k;
ll N[lm];
ll M[lm][lm];

ll dp(int _n, int _k) {
    if (_n == 0) {
        if (_k == 0) return 1;
        return 0;
    }
    if (_k == 0) return 0;
    if (_n < _k) return 0;
    if (M[_n][_k] == -1) {
        ll d1 = dp(_n-1, _k-1);
        ll d2 = dp(_n, _k * 2);
        M[_n][_k] = (d1 + d2) % MOD;
    }
    return M[_n][_k];
}

void solve() {
    cin >> n >> k;
    
    for (int i = 0 ; i <= n; i++)
        for (int j = 0; j <=n ; j++)
            M[i][j] = -1;
    cout << dp(n, k) % MOD << endl;
}
 
int main(int argc, const char * argv[]) {
    ios_base::sync_with_stdio(0);cin.tie(0);
    //cin >> test;
    for (int testCount = 1; testCount <= test; testCount++)
    {
        #ifdef _OLIMPOLOCAL
            cout << "---------------Test case " << testCount << "---------------"<< endl;
        #endif
        solve();
    }
    
    return 0;
}
#include <bits/stdc++.h>

// 1. dp
typedef long double ld;
#define int long long

#define gcd            __gcd
#define endl           "\n"
#define setbits(x)     __builtin_popcountll(x)
#define zrobits(x)     __builtin_ctzll(x)
#define mod            1000000007
#define mod2           998244353
#define maxe           *max_element
#define mine           *min_element
#define inf            1e18
#define pb             push_back
#define all(x)         x.begin(), x.end()
#define f              first
#define s              second
#define lb             lower_bound
#define ub             upper_bound
#define ins            insert
#define sz(x)          (int)(x).size()
#define mk             make_pair
#define deci(x, y)     fixed<<setprecision(y)<<x
#define w(t)           int t; cin>>t; while(t--)
#define nitin          ios_base::sync_with_stdio(false); cin.tie(nullptr)
#define PI             3.141592653589793238
using namespace std;
int dp[4000][4000];
int solve(int n,int k){
    if(k>n) return 0;
    if(n==0) return 1;
    if(k==0) return 0;
    if(dp[n][k]!=0)
        return dp[n][k];
    return dp[n][k]=(solve(n-1,k-1)+solve(n,2*k))%mod2;

}
void solve() {
    int n,k;
    cin>>n>>k;
    cout<<solve(n,k)<<endl;
}

int32_t main() {
    nitin;

    solve();
}
