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

typedef long long LL;
const int mod = 998244353;
const int N = 3000 + 10;

LL dp[N][N];

LL f(LL n, LL k) {
	if(n < k) return 0;
	if(n == k) return 1;
	if(!n) return 0;
	if(!k) return 0;
	if(dp[n][k] != -1) return dp[n][k];
	return dp[n][k] = (f(n - 1, k - 1) + f(n, 2 * k)) % mod;
}

void solve() {
	memset(dp, -1, sizeof dp);
	LL n, k;
	scanf("%lld%lld", &n, &k);
	printf("%lld\n", f(n, k));
}

int main() {
	// freopen("in.txt", "r", stdin);
	solve();
	return 0;
}
#include<bits/stdc++.h>

using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;

#define ordered_set tree<pair<long long int, long long int>, null_type,less<pair<long long int, long long int> >, rb_tree_tag,tree_order_statistics_node_update>

#define iOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define ppb pop_back
#define lb lower_bound
#define ub upper_bound
#define ppf pop_front
//#define mp make_pair
#define L(x) x.length()
#define B(x) x.begin()
#define E(x) x.end()
#define F(x) x.front()
#define SZ(x) x.size()
#define CLR(x) x.clear()
#define SORT(x) sort(x.begin(),x.end())
#define REV(x) reverse(x.begin(),x.end())
#define FOR(i,x,y) for(int i=x;i<y;i++)
#define S(x) scanf("%d",&x)
#define SL(x) cin>>x
#define SD(x) scanf("%lf",&x)
#define SC(x) scanf("%1s",&x)
#define SS(x) scanf("%s",x)
#define DUM() scanf("%c",&dum)
#define READ(x) freopen(x,"r",stdin)
#define WRITE(x) freopen(x,"w",stdout)
#define FILL(x,y) memset(x,y,sizeof(x))
#define IT iterator
#define ret(x) return cout<<x,0;
#define rety return cout<<"YES",0;
#define retn return cout<<"NO",0;
#define rep(i,a,b)    for(int i=a;i<b;i++)
#define repn(i,a,b)   for(int i=a;i>=b;i--)
//#define ld long double

using namespace std;
typedef long long int lli;
typedef long double ld;
typedef unsigned long long int llu;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector< vi > vvi;
typedef vector< pii > vpii;
typedef vector< vpii > vvpii;
typedef vector<string> vs;
typedef vector<vs> vvs;
typedef map<int,int> mapii;


long long int mod=998244353;
#define all(c) c.begin(),c.end()

lli dp[3001][3001];
lli solve(int n, int k)
{
    if(k>n)
        return 0;
    if(n==0 || k==0)
        return 0;
    if(dp[n][k]!=-1)
        return dp[n][k];

    dp[n][k]=(solve(n-1,k-1)+solve(n,2*k))%mod;
    return dp[n][k];
}

int main()
{
    /*freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);*/
    iOS;
    lli test=1;
    //factcalc();
    //cin>>test;
    while(test--)
    {
        int n,k;
        cin>>n>>k;
        for(int i=0;i<=n;++i)
        {
            for(int j=0;j<=n;++j)
                dp[i][j]=-1;
        }
        dp[1][1]=1;
        lli t=(solve(n,k))%mod;
        /*for(int i=0;i<=n;++i)
        {
            for(int j=0;j<=n;++j)
                cout<<dp[i][j]<<" ";
            cout<<endl;
        }*/
        cout<<t;
    }
    /* stuff you should look for
	* int overflow, array bounds
	* special cases (n=1?)
	* do smth instead of nothing and stay organized
	* WRITE STUFF DOWN
	* DON'T GET STUCK ON ONE APPROACH
*/

    return 0;
}
