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

using ull = unsigned long long;
using ll = long long;
using ld = long double;

const int mod = 998244353;
const double pi = acos(-1.0);
const int inf = INT_MAX;

template<const int M>
struct ModInt {
	int val;
	ModInt(): val(-1) {}
	ModInt(ll x) : val(x % M) { if (val < 0) { val += M; }}
	ModInt pow(ll n) const { ModInt ans = 1, x = val; while (n) { if (n & 1) ans *= x; x *= x; n /= 2; } return ans; }
	ModInt inv() const { return pow(M - 2); }

	ModInt operator- () const { return M - val; }
	ModInt operator+ (ModInt m) const { m.val += val; if (m.val >= M) m.val -= M; return m; }
	ModInt operator- (ModInt m) const { m.val = val - m.val; if (m.val < 0) m.val += M; return m; }
	ModInt operator* (ModInt m) const { m.val = m.val * (ll) val % M; return m; }
	ModInt operator/ (ModInt m) const { return *this * m.inv(); }
	ModInt operator+=(ModInt m) { return *this = *this + m; }
	ModInt operator-=(ModInt m) { return *this = *this - m; }
	ModInt operator*=(ModInt m) { return *this = *this * m; }
	ModInt operator/=(ModInt m) { return *this = *this / m; }

	friend ModInt operator+(int lhs, ModInt m) { return ModInt(lhs) + m; }
	friend ModInt operator-(int lhs, ModInt m) { return ModInt(lhs) - m; }
	friend ModInt operator*(int lhs, ModInt m) { return ModInt(lhs) * m; }
	friend ModInt operator/(int lhs, ModInt m) { return ModInt(lhs) / m; }
	friend ModInt operator+(ll  lhs, ModInt m) { return ModInt(lhs) + m; }
	friend ModInt operator-(ll  lhs, ModInt m) { return ModInt(lhs) - m; }
	friend ModInt operator*(ll  lhs, ModInt m) { return ModInt(lhs) * m; }
	friend ModInt operator/(ll  lhs, ModInt m) { return ModInt(lhs) / m; }

	friend ostream &operator<<(ostream &os, const ModInt &m) {
		os << m.val;
		return os;
	}
	friend istream &operator>>(istream &is, ModInt &m) {
		ll x; is >> x; m = x;
		return is;
	}
};

using mint = ModInt<mod>;
const int N = 3000 + 5;

mint dp[N][N];

mint recurse(int n, int k) {
	if (n == 0 && k == 0) {
		return 1;
	}
	if (n == 0 || k == 0 || k > n) {
		return 0;
	}
	if (dp[n][k].val != -1) {
		return dp[n][k];
	}
	return dp[n][k] = recurse(n - 1, k - 1) + recurse(n, k << 1);
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, k;
	cin >> n >> k;
	cout << recurse(n, k) << '\n';
	return 0;
}

#include <stdio.h>
#include <bits/stdc++.h>
#define ll long long int
#define inf 1000000000000
#define mod 998244353
#define sz(x) (int)x.size()
#define all(v) v.begin(), v.end()
#define fi first
#define se second
#define ps(x, y) fixed << setprecision(y) << x
using namespace std;

void solve()
{
	ll n, kl;
	cin >> n >> kl;
	vector<vector<ll>> dp(n + 1, vector<ll>(n + 1, 0));
	dp[1][1] = 1;
	for(int i=2;i<=n;i++)
	{
		for(int k=i;k>=1;k--)
		{
			dp[i][k] = (dp[i][k] + dp[i - 1][k - 1] + (2 * k <= i ? dp[i][2 * k] : 0)) % mod;
		}
	}
	cout << dp[n][kl] << endl;
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
#endif
	int t = 1;
	// cin>>t;
	while (t--)
	{
		solve();
	}
}