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

int main(){
  long long n,m;
  cin >> n >> m;
  
  long long P=998244353;
  long long dp[m+10];
  dp[0]=1;
  dp[1]=0;
  dp[2]=n * (n - 1) / 2;
  
  if(m <= 2){ cout << dp[m]; return 0; }
  
  long long fact[n+1],inv[n+1],fact_inv[n+1];
  
  fact[1]=1;
  fact[0]=1;
  inv[1]=1;
  fact_inv[1]=1;
  fact_inv[0]=1;
  
  for (long long i = 2; i <= n ; i++) {
    fact[i] = fact[i - 1] * i % P;
    inv[i] = P - inv[P % i] * (P / i) % P;
    fact_inv[i] = fact_inv[i - 1] * inv[i] % P;
  }
  
  
  for(long long i = 3 ; i <= m + 5 ; i++){
    dp[i] = 0;
    if(i % 2 == 1){ continue; }
    
    for(long long j = 0 ; j <= min(i / 2 , n / 2) ; j++){
      long long plus = dp[(i - 2 * j) / 2];
      plus %= P;
      plus *= fact[n];
      plus %= P;
      plus *= fact_inv[n - (2 * j)];
      plus %= P;
      plus *= fact_inv[2 * j];
      plus %= P;
      dp[i] += plus;
      dp[i] %= P;
    }
  }
  
  cout << dp[m];
  
  return 0;
}
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
#include <bits/stdc++.h>
#include<set>
#include <array>
using namespace std;
#define ll long long
#define endl '\n'
#define mod 998244353
#define pb push_back
#define ff first
#define ss second
#define con continue
#define ub upper_bound
#define lb lower_bound

#define si(x) int(x.size())
#define sum_all(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())
const double pi = 2 * acos(0.0);
const int dx[] = { -1, 0, 1, 0 };
const int dy[] = { 0, -1, 0, 1 };

const int dx8[] = { -1, 0, 1, 0,1,1,-1,-1 };
const int dy8[] = { 0, -1, 0, 1,1,-1,1,-1 };

ll min(ll a, ll b)
{
    if (a < b)return a;
    return b;
}
ll max(ll a, ll b)
{
    if (a > b)return a;
    return b;
}
ll ceil1(ll a, ll b)
{
    return(a + b - 1) / b;
}
void read(vector<ll>& arr)
{
    for (ll i = 0; i < si(arr); i++)
        cin >> arr[i];

}

void read_graph(vector<vector<ll>>& g, ll m)
{
    while (m--)
    {
        ll x, y; cin >> x >> y;
        x--, y--;
        g[x].pb(y);
        g[y].pb(x);
    }
}


vector<vector<ll>> c;

ll ncr(ll n, ll r)
{
    if (n == r) return 1;
    if (r<0 or r > n) return 0;
    return c[n][r];
}
void pre(ll lim = 5003)
{
    c = vector<vector<ll>>(lim + 1, vector<ll>(lim + 1));
    c[0][0] = 1;
    for(ll i=1;i<=lim;i++)
        for (ll j = 0; j <= lim; j++)
        {
            c[i][j] = ncr(i-1,j) + ncr(i-1,j-1);
            c[i][j] %= mod; 
        }
}

void solve()
{
    ll n, m;
    cin >> n >> m;
    int lim = 5001;
    pre();


    if (m % 2 == 1)
    {
        cout << 0 << endl;
        return;
    }

    vector<vector<ll>> dp(32, vector<ll>(n + 13));
    // base case
    for (int i = 0; i <= n; i += 2)
    {
        dp[0][i / 2] = ncr(n, i);
    }
   
    //cout << ncr(n, 2) << endl; 
    for (int i = 1; i < 13; i++)
    {
        
        
            for (int k = 0; k <= n; k += 2)
            {
                if ((m & (1ll << i)) > 0)
                {
                    for (int j = 1; j <= n; j+=2)
                    {
                      
                        ll x = (j + k) / 2;
                        dp[i][x] += (dp[i - 1][j] * ncr(n, k))%mod;
                        dp[i][x] %= mod;
                    }
                }
                else
                {
                    for (int j = 0; j <= n; j+=2)
                    {
                       
                        ll x = (j + k) / 2;
                        dp[i][x] += (dp[i - 1][j] * ncr(n, k))%mod;
                        dp[i][x] %= mod;
                    }
                }
            }
        

    }

    cout << dp[12][0] << endl;


}


int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    //int t; cin >> t; while (t--)
    solve();

}
