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

const int MAX = 5010;
const int MOD = 998244353;

int64_t fac[MAX], finv[MAX], inv[MAX];

void COMinit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}
 
int64_t COM(int n, int k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}

int main() {
  COMinit();
  
  int N, M;
  cin >> N >> M;
  
  if (M%2 == 1 || N == 1) {
    cout << 0 << endl;
    return 0;
  }

  vector<int64_t> dp(M+1,0);
  dp[0] = 1;
  for (int i = 2; i <= M; i += 2) {
    int sum = 0;
    for (int j = 0; j <= i; j += 2) {
      sum = (sum + (COM(N,j) * dp[(i-j)/2])%MOD )%MOD;
    }
    dp[i] = sum;
  }
  
  cout << dp[M] << endl;
  
  return 0;
}

#include<bits/stdc++.h>

using namespace std;

#define rep(x, L, R) for(int x = (L), _x = (R); x <= _x; x++)
#define per(x, R, L) for(int x = (R), _x = (L); x >= _x; x--)
#define broken fprintf(stderr, "running on %s %d\n", __FUNCTION__, __LINE__)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define SZ(v) (int)(v).size()
#define ALL(x) (x).begin(), (x).end()
#define x first
#define y second
#define mp make_pair
#define pb push_back

template<typename T> inline bool ckmin(T &a, const T &b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

typedef pair<int, int> par;
typedef long long LL;
typedef unsigned long long uLL;
typedef double db;
const int N = 5000 + 10, md = 998244353; 
int n, m;
int fac[N], ifac[N];
int dp[N][N];
int qpow(int a, int b) {
	int res = 1;
	for(; b; b >>= 1, a = 1ll * a * a % md) if(b & 1) res = 1ll * res * a % md;
	return res;
}

int b(int n, int m) { 
	if(n < m) return 0;
	return 1ll * fac[n] * ifac[m] % md * ifac[n - m] % md;
}

void initfac(int n) {
	fac[0] = 1;
	for(int i = 1; i <= n; i++) fac[i] = 1ll * fac[i - 1] * i % md;
	ifac[n] = qpow(fac[n], md - 2);
	for(int i = n - 1; i >= 0; i--) ifac[i] = 1ll * ifac[i + 1] * (i + 1) % md;
	return;
}

int main() {
	scanf("%d%d", &n, &m);
	initfac(n);
	dp[0][0] = 1;
	int now = 0;
	for(int i = 0, k = 1; k <= m; k <<= 1, i++) {
		for(int j = 0; j <= m; j++) {
			for(int l = 0; j + l * k <= m && l <= n; l += 2) {
				dp[i + 1][j + k * l] = (dp[i + 1][j + k * l] + 1ll * dp[i][j] * b(n, l) % md) % md;
//				cout << dp[i][j] << endl;
			}
		}
		now = i + 1;
	}
	printf("%d\n", dp[now][m]);
	return 0;
}

