#include<bits/stdc++.h> 
#define int long long
#define x first
#define y second
#define mp make_pair
#define pb push_back
#define endl "\n"
using namespace std;

const int max_n = 5e3+10;
const int inf = 1e18;
const int Mod = 998244353;

int n,m;
int dp[22][max_n];
int fact[max_n];
int NCR[max_n][max_n];

int f(int j,int M){
    if(j==-1 && M==0){
        return 1;
    }
    if(j==-1) return 0;
    if(dp[j][M]!=-1) return dp[j][M];
        
    int ans=0;
    for(int k=0;k<=n;k+=2){
        if((k*(1LL<<j))>M) break;

        int c = (NCR[n][k]*f(j-1,M-(k*(1LL<<j))))%Mod;
        ans = (ans+c)%Mod;
    }

    dp[j][M]=ans;
    return ans;
}

void fill(){
    for(int n=0;n<max_n;n++){
        for(int r=0;r<max_n;r++){
            if(r>n){
                NCR[n][r]=0;
            }else if(r==0){
                NCR[n][r]=1;
            }else if(n==0){
                NCR[n][r]=0;
            }else{
                NCR[n][r]=(NCR[n-1][r-1]+NCR[n-1][r])%Mod;
            }
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    fill();

    memset(dp,-1,sizeof(dp));

    cin>>n>>m;

    cout<<f(15,m)<<endl;

}
#include <cmath>
#include <deque>
#include <algorithm>
#include <iterator>
#include <list>
#include <tuple>
#include <map>
#include <unordered_map>
#include <queue>
#include <set>
#include <unordered_set>
#include <stack>
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <functional>
#include <numeric>
#include <iomanip> 
#include <stdio.h>
//end of libraries
#define lnf 3999999999999999999
#define inf 999999999
#define PI 3.14159265359
#define endl "\n"
#define fi first
#define se second
#define pb push_back
#define ll long long
#define all(c) (c).begin(),(c).end()
#define sz(c) (int)(c).size()
#define mkp(a,b) make_pair(a,b)
#define make_unique(a) sort(all(a)),a.erase(unique(all(a)),a.end())
#define rsz(a,n) a.resize(n)
#define pii pair <int,int>
#define rep(i,n) for(int i = 0 ; i < n ; i++) 
#define drep(i,n) for(int i = n-1 ; i >= 0 ; i--)
#define crep(i,x,n) for(int i = x ; i < n ; i++)
#define fcin ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);

const int max_n = 5500;

using namespace std;
ll mod = 998244353 , fact[max_n];
ll binpow(ll a, ll b) {  
  a %= mod; ll res = 1; 
  while (b) { if (b%2) res = res * a % mod; a = a * a % mod; b /= 2; } 
  return res % mod;
}
void dofact() {
  fact[0]=fact[1]=1;
  rep(i,max_n-3){
    if(i>1)fact[i] = fact[i-1]*i; fact[i] %= mod;
  }
}

ll cnk(ll k , ll n){
  if(k>n) return 0;
  return (fact[n] * binpow(fact[k]*fact[n-k]%mod,mod-2)) % mod;
}
ll sub(ll a , ll b){
  a%=mod; b%=mod;
  return (((a-b)%mod)+mod)%mod;
}
ll prod(ll a , ll b){
  a%=mod; b%=mod;
  return ((a*b)%mod);
}

ll add(ll a , ll b){
  a%=mod; b%=mod;
  return (a+b)%mod;
}

ll dp[max_n] , nedp[max_n];

vector <ll> a;

int n,m;

void read() {
	cin >> n >> m;
	int x = 1;
	while(x<=m) {
		a.pb(x);
		x*=2;
	}
}

int main(){
fcin;
dofact();
	
	read();

	dp[0] = 1;

	rep(idx,sz(a)){
		int i = a[idx];
		rep(j,m+1) nedp[j]=dp[j]; 
		for(int j = 0 ; j <= m ; j++) {
			if(dp[j]==0) continue;
			int x = 2;
			while(j+x*i <= m) {
				int nxt = j+x*i;
				nedp[nxt] = add(nedp[nxt],prod(dp[j],cnk(x,n)));	
				x+=2;
			}
		}
		rep(j,m+1) dp[j] = nedp[j];
		// rep(j,m+1) {
		// 	cout << dp[j] << " ";
		// }cout << "\n";
	}

	cout << dp[m] << "\n";
/*
*/

    return 0;   
}
