// give up
#include<iostream>
#include<vector>

constexpr auto MOD = 998244353LL;

template <class T> void in(T& a) {std::cin >> a;}
template <class T, class... U> void in(T& a, U&... b) {in(a); in(b...);}
template <char D = '\n', class T> void out(T a) {std::cout << a << D;}
template <class T, class... U> void out(T a, U... b) {out<' '>(a); out(b...);}

template <long long MOD> auto make_comb_mod(long long size) {
  size++;
  std::vector<long long> fact(size, 1), inv(size, 1), fact_inv(size, 1);
  for (auto i = 2LL; i < size; i++) {
    fact[i] = fact[i - 1] * i % MOD;
    inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
    fact_inv[i] = fact_inv[i - 1] * inv[i] % MOD;
  }
  return [fact, fact_inv](long long n, long long k) {
    return n >= k && k >= 0
      ? fact[n] * (fact_inv[k] * fact_inv[n - k] % MOD) % MOD : 0LL;
  };
}

int main() {
  // input
  long long N, M;
  in(N, M);

  // solve
  std::vector<long long> dp(1, 1);
  const auto comb_mod = make_comb_mod<MOD>(5000);
  for (auto i = 1; i <= M; i++) {
    dp.emplace_back(0);
    if (~i & 1) {
      for (auto j = 0; j * 2 <= i; j++) {
        dp.back() += (comb_mod(N, j * 2) * dp[i / 2 - j]) % MOD;
        dp.back() %= MOD;
      }
    }
  }
  auto result = dp.back();

  // output
  out(result);
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5100,P=998244353;
ll n,m,C[N][N],f[20][N];
signed main()
{
	scanf("%lld%lld",&n,&m);C[0][0]=1;
	for(ll i=1;i<N;i++)
		for(ll j=0;j<N;j++)
			C[i][j]=((j?C[i-1][j-1]:0)+C[i-1][j])%P;
	f[0][0]=1;ll z=0;
	for(ll p=1;p<=m;p<<=1){
		z++;
		for(ll j=0;j<=m;j++)f[z][j]=f[z-1][j];
		for(ll i=2;i*p<=m;i+=2){
			ll k=i*p;
			for(ll j=0;j<=m-k;j++)
				(f[z][j+k]+=f[z-1][j]*C[n][i]%P)%=P;
		}
	}
	printf("%lld\n",f[z][m]);
}