#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e3+5;
const int mod=998244353;
int n,m;
int dp[15][N];
int fac[N],invf[N];
inline int po(int x,int k){
	int ret=1;
	while(k){
		if(k&1) ret=1ll*ret*x%mod;
		x=1ll*x*x%mod;
		k>>=1;
	}
	return ret;
}
inline int C(int x,int k){
	if(x<k) return 0;
	return 1ll*fac[x]*invf[k]%mod*invf[x-k]%mod;
}
int main(){
	int i,j,k;
	fac[0]=1;
	for(i=1;i<N;i++) fac[i]=1ll*fac[i-1]*i%mod;
	invf[N-1]=po(fac[N-1],mod-2);
	for(i=N-2;i>=0;i--) invf[i]=ll(i+1)*invf[i+1]%mod;
	cin>>n>>m;
	dp[0][0]=1;
	for(i=0;(1<<i)<=m;i++){
		for(j=0;j*(1<<i)<=m&&j<=n;j+=2){
			for(k=j*(1<<i);k<=m;k++)
				dp[i+1][k]=(dp[i+1][k]+1ll*dp[i][k-j*(1<<i)]*C(n,j))%mod;
		}
	}
	cout<<dp[i][m];
	return 0;
}
#include <bits/stdc++.h>
#define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
typedef long long ll;
typedef long double ld;
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define mod 998244353 
#define inf 1000000000000000
#define autoit(x,it) for(auto it = x.begin(); it != x.end(); it++)
#define rep(n) for(ll i = 0; i < n; i++)
#define repi(i,n) for(ll i = 0; i < n; i++)
 
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
 
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update> 
 
using namespace std;
 

ll powa(ll a, ll b, ll c)
{
    a%=c;
    if(a<0)
	a+=c;
    ll res = 1;
    while(b>0)
    {
        if(b&1)
            res*=a, res%=c;
        a*=a, a%=c;
        b>>=1;
    }
    return res;
}
 
ll root = 31;
ll root_1;
ll root_pw = (1ll << 23);
 
void fft(vector<ll> & a, bool invert) {
    ll n = a.size();
 
    for (ll i = 1, j = 0; i < n; i++) {
        ll bit = n >> 1;
        for (; j & bit; bit >>= 1)
            j ^= bit;
        j ^= bit;
 
        if (i < j)
            swap(a[i], a[j]);
    }
 
    for (ll len = 2; len <= n; len <<= 1) {
        ll wlen = invert ? root_1 : root;
        for (ll i = len; i < root_pw; i <<= 1)
            wlen = (ll)(1LL * wlen * wlen % mod);
 
        for (ll i = 0; i < n; i += len) {
            ll w = 1;
            for (ll j = 0; j < len / 2; j++) {
                ll u = a[i+j], v = (ll)(1LL * a[i+j+len/2] * w % mod);
                a[i+j] = u + v < mod ? u + v : u + v - mod;
                a[i+j+len/2] = u - v >= 0 ? u - v : u - v + mod;
                w = (ll)(1LL * w * wlen % mod);
            }
        }
    }
 
    if (invert) {
        ll n_1 = powa(n,mod-2,mod);
        for (ll & x : a)
            x = (ll)(1LL * x * n_1 % mod);
    }
}
 
vector<ll> multiply(vector<ll> const& a, vector<ll> const& b) {
    vector<ll> fa(a.begin(), a.end()), fb(b.begin(), b.end());
    ll n = 1;
    while (n < a.size() + b.size()) 
        n <<= 1;
    fa.resize(n);
    fb.resize(n);
    
    while(root_pw>n)
    {
         root_pw>>=1;
         root*=root;
         root%=mod;
    }
    //cout<<"root = "<<root<<"\n";
    root_1 = powa(root,mod-2,mod);
    
    fft(fa, false);
    fft(fb, false);
    for (ll i = 0; i < n; i++)
        fa[i] *= fb[i], fa[i]%=mod;
    fft(fa, true);
    root = 31;
    root_pw = (1ll << 23);
    return fa;
}

 
ll norm(ll a)
{
    a%=mod;
    if(a<0)
        a+=mod;
    return a;    
}
 
ll add(ll a, ll b)
{
    a = norm(a);
    b = norm(b);
    return norm(a+b);
}
 
ll mul(ll a, ll b)
{
    a = norm(a);
    b = norm(b);
    return norm(a*b);
}
 
 
ll sub(ll a, ll b)
{
    a = norm(a);
    b = norm(b);
    return norm(a-b);
}
 
ll divi(ll a, ll b)
{
    b = powa(b,mod-2,mod);
    return mul(a,b);
}

#define N 200005
 
ll fact[N];
ll ifact[N];
 
ll ncr(ll n, ll r)
{
    if(r>n)
        return 0;
    ll ans = fact[n];
    ans*=ifact[r];
    ans%=mod;
    ans*=ifact[n-r];
    ans%=mod;
    return ans;
}

#define N1 14

int main()
{
  FAST/**/
   
   fact[0] = 1;
   for(ll i=1;i<N;i++)
        fact[i] = fact[i-1]*i, fact[i]%=mod;
   for(ll i=0;i<N;i++)
        ifact[i] = powa(fact[i],mod-2,mod);  
   
   ll n,m;
   cin>>n>>m;
   
   vector<ll> poly(1,1);
   for(ll i=0;i<14;i++)
   {
       vector<ll> poly1(m+1,0);
       ll temp = powa(2,i,mod);
       for(ll cnt = 0; cnt <= n && cnt <= m/temp; cnt += 2)
       {
           ll id = cnt*temp;
           poly1[id] = ncr(n,cnt);
           //cout<<"coeff = "<<poly1[id]<<'\n';
       }
       
       poly = multiply(poly, poly1);
       while(poly.size()>1 && poly.size()>m+1)
            poly.pop_back();
   }
   
   ll ans = 0;
   if(poly.size()>m)
        ans = poly[m];
   cout<<ans<<"\n";        
   
   return 0;        
}  

   
 