#include <bits/stdc++.h>
#define fi first
#define se second
#define gc getchar() //(p1==p2&&(p2=(p1=buf)+fread(buf,1,size,stdin),p1==p2)?EOF:*p1++)
#define mk make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pb push_back
#define IT iterator
#define V vector
#define TP template <class o>
#define TPP template <typename t1, typename t2>
#define SZ(a) ((int)a.size())
#define all(a) a.begin(), a.end()
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = b; i >= a; i--)
#define FOR(i, n) rep(i, 1, n)
#define debug(x) cerr << #x << ' ' << '=' << ' ' << x << endl
using namespace std;
typedef unsigned ui;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;

// char buf[1 << 20],*p1=buf,*p2=buf;
TP void qr(o& x) {
    char c = gc;
    x = 0;
    int f = 1;
    while (!isdigit(c)) {
        if (c == '-')
            f = -1;
        c = gc;
    }
    while (isdigit(c))
        x = x * 10 + c - '0', c = gc;
    x *= f;
}
template <class o, class... O> void qr(o& x, O&... y) {
    qr(x);
    qr(y...);
}
TP void qw(o x) {
    if (x / 10)
        qw(x / 10);
    putchar(x % 10 + '0');
}
TP void pr1(o x) {
    if (x < 0)
        x = -x, putchar('-');
    qw(x);
    putchar(' ');
}
template <class o, class... O> void pr1(o x, O... y) {
    pr1(x);
    pr1(y...);
}
TP void pr2(o x) {
    if (x < 0)
        x = -x, putchar('-');
    qw(x);
    putchar(10);
}
template <class o, class... O> void pr2(o x, O... y) {
    pr2(x);
    pr2(y...);
}

TP void cmax(o& x, o y) {
    if (x < y)
        x = y;
}
TP void cmin(o& x, o y) {
    if (x > y)
        x = y;
}

const int mod = 998244353;
TPP void ad(t1& x, t2 y) {
    x += y;
    if (x >= mod)
        x -= mod;
}
TPP void dl(t1& x, t2 y) {
    x -= y;
    if (x < 0)
        x += mod;
}

const int N = 5010, inf = 2e9;
const ll INF = 1e15;
int n, m, f[N], g[N], C[N][N];

void solve() {
    qr(n, m);
    f[m] = 1;
    rep(i, 0, n) {
        C[i][0] = 1;
        FOR(j, i) C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
    }
    if (m & 1) {
        return pr2(0);
    }
    while (m) {
        memcpy(g, f, sizeof g);
        memset(f, 0, sizeof f);
        for (int i = 0; i <= m; i += 2)
            if (g[i]) {
                for (int j = 0; j <= i; j += 2)
                    ad(f[(i - j) / 2], (ll)g[i] * C[n][j] % mod);
            }
        m /= 2;
    }
    pr2(f[0]);
}

int main() {
#ifndef ONLINE_JUDGE
    clock_t start_time = clock();
#endif
    int T = 1;
    // qr(T);
    while (T--)
        solve();
#ifndef ONLINE_JUDGE
    cerr << 1.0 * (clock() - start_time) / CLOCKS_PER_SEC << ' ' << 's' << endl;
#endif
    return 0;
}
#include<bits/stdc++.h>
#define inf 1e18
#define endl "\n"
#define mp make_pair
#define pb push_back
#define loop(i,x,y) for(int i = x; i < y ; i++ )
#define all(x) (x).begin(),(x).end()
#define in(n)       int n; cin>>n;
#define inarr(arr,n) vector<int>arr(n); for(int i = 0; i < n ; i++){cin>>arr[i];}
#define maploop(x) for(auto itr = x.begin(); itr != x.end();itr++)
#define int long long
using namespace std;
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x<<" "; _print(x); cerr << endl;
#else
#define debug(x);
#endif

void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(double t) {cerr << t;}


template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.first); cerr << ","; _print(p.second); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------*/


const int N = 50001;
const int mod = 998244353;

int fac[N];
int mul(int a, int b)
{
	return (a * b) % mod;
}
void pre()
{
	fac[0] = 1;
	loop(i, 1, N)
	{
		fac[i] = mul(fac[i - 1], i);
	}
}
int pow(int a, int b)
{
	int z = 1;
	while (b  > 0 )
	{
		if (b % 2)
		{
			z = mul(a, z);
		}
		a = mul(a, a);
		b = b / 2;

	}
	return z;
}
int div(int a)
{
	int ans;
	return ans = pow(a, mod - 2);
}
int comb(int n, int k)
{
	if (n >= k)
	{
		return mul(fac[n], div(mul(fac[k], fac[n - k])));
	}
	else
		return 0;
}
void Main()
{
	in(n)
	in(m)
	vector<int>vis(m + 1, 0);
	vis[0] = 1;
	loop(i, 0, 18)
	{
		vector<int>temp(m + 1, 0);
		//temp = vis;
		int inc = 0;
		for (int j = 0 ; j <= n; j += 2)
		{
			loop(k, 0, m + 1)
			{
				if (inc + k > m)
					break;
				//cout << inc + k << endl;
				temp[inc + k] += (vis[k] * comb(n, j)) % mod;
				if (temp[inc + k] >= mod)
				{
					temp[inc + k] -= mod;
				}
			}
			inc += 2 * (1 << i);
		}
		vis = temp;

	}
	cout << vis[m] << endl;
}

int32_t main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int t = 1;
	pre();
//	cin >> t;
	while (t--)
	{
		Main();
	}
}