#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp> //required
//#include <ext/pb_ds/tree_policy.hpp> //required

//using namespace __gnu_pbds; //required 
using namespace std;
//template <typename T> using ordered_set =  tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; 

// ordered_set <int> s;
// s.find_by_order(k); returns the (k+1)th smallest element
// s.order_of_key(k); returns the number of elements in s strictly less than k

#define MOD              (998244353) // change as required
#define pb(x)            push_back(x)
#define mp(x,y)          make_pair(x,y)
#define all(x)           x.begin(), x.end()
#define print(vec,l,r)   for(int i = l; i <= r; i++) cout << vec[i] <<" "; cout << endl;
#define input(vec,N)     for(int i = 0; i < (N); i++) cin >> vec[i];
#define debug(x)         cerr << #x << " = " << (x) << endl;
#define leftmost_bit(x)  (63-__builtin_clzll(x))
#define rightmost_bit(x) __builtin_ctzll(x)
#define set_bits(x)      __builtin_popcountll(x)
  
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

typedef long long int ll;

// highly risky #defines
#define int ll // disable when you want to make code a bit faster
#define endl '\n' // disable when dealing with interactive problems

const int MAXN = 3002;

int dp[MAXN][2*MAXN];

void solve(){
	// code starts from here
	int N, K;
    cin >> N >> K;
    
    for(int i = 0; i < MAXN; i++){
        dp[i][i] = 1;
        dp[i][0] = 0;
    }
    for(int i = 0; i < MAXN; i++){
        for(int j = i+1; j < 2*MAXN; j++) dp[i][j] = 0;
    }
    for(int i = 2; i <= N; i++){
        for(int j = N; j >= 1; j--){
            dp[i][j] = dp[i-1][j-1] + dp[i][2*j];
            dp[i][j] %= MOD;
        }
    }

    cout << dp[N][K] << endl;
}


clock_t startTime;
double getCurrentTime() {
	return (double)(clock() - startTime) / CLOCKS_PER_SEC;
}

signed main(){
 	ios_base::sync_with_stdio(false);
    cin.tie(NULL);
	//startTime = clock();
	
	int T = 1;
	// cin >> T;

	while(T--){
		solve();
	}
	
	//cerr << getCurrentTime() << endl;
	return 0;
}

#include <bits/stdc++.h>
#define ll long long int
#define pb push_back
#define st first
#define nd second
#define pii pair<int,int>
#define mp make_pair
#define pll pair<long long,long long>

using namespace std;

const int nax = 3005;
const int mod = 998244353;

ll dp[nax][nax];
int n,k;

void solve(){
    cin >> n >> k;
    dp[0][0] = 1;
    for(int i=1;i<=n;i++){
        for(int j=0;j<nax;j++){
            for(int c=0;c<12;c++){
                if(j * (1 << c) - 1 < nax) dp[i][j] += dp[i - 1][j * (1 << c) - 1];
                dp[i][j] %= mod;
            }
        }
    }
    cout << dp[n][k];
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);

    int tt = 1;
    // cin >> tt;
    while(tt--) solve();

    return 0;
}
