#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(int i=a,ggdem=b;i<ggdem;++i)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset((a),(v),sizeof(a))
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;

const ll MOD=998244353;

const int MAXN=5005;

ll fact[MAXN],facti[MAXN];

ll be(ll b, ll e, ll mod){
  ll r=1;
  while(e)if(e&1)r=(r*b)%mod,e^=1; else b=(b*b)%mod,e/=2;
  return r;
}

ll comb(ll n, ll k){
	if(k>n)return 0;
	return fact[n]*(facti[k]*facti[n-k]%MOD)%MOD;
}

vector<ll> mul(vector<ll> a, vector<ll> b){
	vector<ll> res(SZ(a)+SZ(b)-1);
	fore(i,0,SZ(a)){
		if(a[i]==0)continue;
		fore(j,0,SZ(b)){
			res[i+j]=(res[i+j]+a[i]*b[j])%MOD;
		}
	}
	return res;
}

int main(){FIN;
	fact[0]=1;
	fore(i,1,MAXN)fact[i]=fact[i-1]*i%MOD;
	fore(i,0,MAXN)facti[i]=be(fact[i],MOD-2,MOD);
	ll n,m; cin>>n>>m;
	if(m&1){
		cout<<"0\n";
		return 0;
	}
	vector<ll> res(m+1);
	res[0]=1;
	fore(i,0,13){
		ll pot=(1ll<<(i+1));
		if(pot>m)break;
		vector<ll> p(m+1);
		for(ll j=0;j<=m;j+=pot){
			p[j]=comb(n,2*j/pot);
		}
		//for(auto i:p)cout<<i<<" ";
		//cout<<"\n";
		res=mul(p,res);
		//for(auto i:res)cout<<i<<" ";
		//cout<<"\n";
		while(SZ(res)>m+1)res.pop_back();
	}
	cout<<res.back()<<"\n";
	
	return 0;
}
#include<cstdio>
 
#define mod 998244353
#define N 5001
 
int f[N],C[N][N];
 
int main()
{
	int n,m,t;
	scanf("%d%d",&n,&m);
	for(int i=0;i<=n;++i)
	{
		C[i][0]=1;
		for(int j=1;j<=i;++j) 
		{
			C[i][j]=C[i-1][j-1]+C[i-1][j];
			if(C[i][j]>=mod) C[i][j]-=mod;
		}
	}
	f[0]=1;
	for(int i=0;i<=11;++i)
	{
		t=(1<<i)<<1;
		for(int k=m;k>=t;--k)
			for(int j=t,l=2;j<=k;j+=t,l+=2)
			{
				f[k]+=1ll*f[k-j]*C[n][l]%mod;
				if(f[k]>=mod) f[k]-=mod;
			}
	}
	printf("%d",f[m]);
}