#include <bits/stdc++.h>

#define INF 1000000007
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define REP(i,a,b) for (int i = a; i < b; i++)

using namespace std; 

typedef long long ll;
typedef long long int  lli;
typedef long double ld;
typedef vector<int> vi;
typedef unordered_map<int,int> umi ;
typedef unordered_set<int> usi ;
typedef pair<int,int> pi;

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif


 
 
//declare here -------------------------------------------------------------------------------
const int N =3e3+1 ;
ll dp[N][N] ;
ll md =998244353 ;
ll ways(int  k, int n){
    if(k==0 && n==0) return 1;
    if(k<=0 || n<=0) return 0;
    if(k>n) return 0 ;
    if(k==n) return 1; 
    if(dp[k][n]!=-1) return dp[k][n] ;
    int res=0 ;
    res+=ways(k-1,n-1)%md ;
    res+=ways(2*k ,n)%md ;
    dp[k][n]=res%md; 
    return res%md ;
}

// solve here ---------------------------------------------------------------------------------
void solve(){
    int n ,k ;
    memset(dp,-1 ,sizeof(dp)) ;
    cin>>n>>k ;
    cout<<ways(k,n) ;
}

//--------------------------------------------------------------------------------------------



 

int main(){
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    long long test =1 ;
    //cin>>test ;
    REP(i,1,test+1){
        debug(i) ;
        //cout<<"Case #"<<i<<": " ;
        solve() ;
        cout<<"\n" ;
    }
    return 0 ;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn=6010,mod=998244353;
int dp[maxn][maxn];
int n,K; 
int main(){
	cin>>n>>K;
	dp[0][0]=1;
	for(int i=1;i<=n;++i)
		for(int j=i;j>0;--j){
			dp[i][j]=(dp[i-1][j-1]+dp[i][2*j])%mod;
		}
	printf("%d\n",dp[n][K]);
}