#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[100];int n;const int mod=998244353;
int f[210000],finv[210000];
inline int qpow(int a,int b,int p)
{
    int k=1;
    while(b)
    {
        if(b&1) k=k*a%p;
        a=a*a%p;b>>=1;
    }return k;
}
inline int comb(int n,int m)
{
    if(n<m) return 0;
    if(n==m||m==0) return 1;
    return f[n]*finv[n-m]%mod*finv[m]%mod;
}int ans=0;
/*inline int lowbit(int x){return x&(-x);}
int num=0;
inline void dfs(int x,int left,int bas,int mul)
{
    if(left==0)
    {
        int res=1;
        //cout<<">> "<<r<<endl;
        num++;
        if(num%10000000==0) cout<<num<<endl;
        ans+=mul;
        return ;
    }
    if(lowbit(left)<bas) return ;
    if(bas>left) return ;
    for(int i=0;i*bas<=left&&i<=n;i+=2)
    {
        a[x]=i;
        dfs(x+1,left-i*bas,bas<<1,mul*comb(n,i)%mod);
    }
}*/

int dp[6000];
signed main()
{
    f[0]=finv[0]=1;
    for(int i=1;i<=201000;i++) f[i]=f[i-1]*i%mod;
    finv[201000]=qpow(f[201000],mod-2,mod);
    for(int i=201000-1;i>=1;i--) finv[i]=finv[i+1]*(i+1)%mod;
    
    int m;
    cin>>n>>m;
    ans=0;
    dp[0]=1;
    for(int i=2;i<=m;i+=2)
    {
        for(int j=0;j<=i;j+=2)
        {
            dp[i]+=dp[(i-j)>>1]*comb(n,j)%mod;
            dp[i]%=mod;
        }
    }
    cout<<dp[m]<<endl;
}
#pragma GCC optimize("O3")
#pragma GCC target("sse4")

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<int, int> pii;

typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;

#define FOR(i, a, b) for (int i = a; i <= (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b); i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)
#define trav(a, x) for (auto &a : x)

#define sz(x) (int)(x).size()
#define popcnt(x) __builtin_popcount(x)
#define low_bo(a, x) (lower_bound(a.begin(), a.end(), x) - a.begin())
#define up_bo(a, x) (upper_bound(a.begin(), a.end(), x) - a.begin())
#define unique(a) a.resize(unique(a.begin(), a.end()) - a.begin())
#define shuffle(a) shuffle(a.begin(), a.end(), rnd)
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()
#define ins insert

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MOD = 998244353;
const char nl = '\n';
const int MX = 20000; //check the limits, dummy
int n, m, np;
ull fac[MX];
ll c[5001];
ll rev(ll x, ll m) { return x == 1 ? 1 : (1 - rev(m % x, x) * (ll)m) / x + m; }
ll choose(ll n, ll r) {
	if (n < r)
		return 0;
	if (r == 0)
		return 1;
	return ((fac[n] * (rev(fac[r], MOD) % MOD)) % MOD * (rev(fac[n - r], MOD) % MOD)) % MOD;
}
void init() {
	fac[0] = 1;
	for (int i = 1; i < MX; i++)
		fac[i] = (fac[i - 1] * i) % MOD;
}
void solve(int t) {
	cin >> n >> m;
	np = (n / 2) * 2;
	if (m % 2) {
		cout << "0\n";
		return;
	}
	ll dp[5001][13];
	for (int ma = 0; ma < 5001; ma++) {
		if (ma % 2) continue;
		dp[ma][0] = choose(n, ma);
	}
	for (int d = 1; d < 13; d++) {
		for (int ma = 0; ma < 5001; ma++) {
			if (ma % 2) continue;
			int p2 = (1 << d);
			int mx = min(ma / 2 / p2, n / 2);
			ll ret = 0;
			for (int i = 0; i <= mx; i++) {
				ret = ((dp[2 * i][0] * dp[ma - i * 2 * p2][d - 1]) % MOD + ret) % MOD;
			}
			dp[ma][d] = ret;
		}
	}
	int d = 0;
	while ((1 << d) <= m)
		d++;
	cout << dp[m][d - 2] << nl;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cout.precision(20);
	cout << fixed;
	init();
	int T = 1;
	F0R(i, T) {
		solve(i + 1);
	}
}

// read the question correctly (ll vs int)
// template by bqi343