#include <bits/stdc++.h>

#define cnk(n,k) ((fact[(n)] * invfact[(k)] % MOD) * invfact[(n)-(k)] % MOD)

using namespace std;

typedef long long ll;

const ll MOD = 998244353;

const int MAXN = 2*1e5 + 2;

int n, m, s;
ll ans[6000];

ll fact[MAXN], invfact[MAXN];

void precomp() {
	fact[0] = invfact[0] = 1;
	for(int i = 1; i < MAXN; i++) {
		fact[i] = fact[i-1]*i;
		fact[i] %= MOD;
		ll tmp = fact[i];
		invfact[i] = 1;
		for(int pw = MOD-2; pw; pw /= 2) {
			if(pw & 1) {
				invfact[i] *= tmp;
				invfact[i] %= MOD;
			}
			tmp *= tmp;
			tmp %= MOD;
		}
	}
}


int main() {
	precomp();
	
	cin >> n >> m;
	ans[0] = 1;
	for(int k = 2; k <= m; k+=2) {
		for(int t = 0; t <= k && t <= n; t+=2) {
			ans[k] += ans[(k-t)>>1] * cnk(n,t);
			ans[k] %= MOD;
		}
	}
	
	
	cout << ans[m] << '\n';
	
	return 0;
}	

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
using namespace __gnu_pbds;
using namespace std;


#define LETS_GET_SCHWIFTY ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);  
#define ff              first
#define ss              second
#define int             long long
#define ll              long long
#define pb              push_back
#define pii             pair<int,int>
#define vi              vector<int>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int> >
#define setbits(x)      __builtin_popcountll(x)
#define zerobits(x)      __builtin_ctzll(x)
#define mod             998244353
#define inf             1e18
#define ps(x,y)         fixed<<setprecision(y)<<x
#define vpii            vector<pair<int,int> >
#define all(x)          x.begin(),x.end()
#define matrixprint(arr,a,b,c,d) for(int i=a;i<=c;i++){for(int j=b;j<=d;j++){cout<<arr[i][j]<<" ";}cout<<"\n";}
#define show(arr,x,y)   for(int i=x;i<=y;i++){cout<<arr[i]<<" ";}cout<<"\n"
#define sz(x)           (int)x.size()
#define db(x)           cout<<x<<"\n";

typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;

//insert,find_by_order,order_of_key,lower_bound,upper_bound;

#define TRACE
#ifdef TRACE
#define deb(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
    cout << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
    const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1 << " | "; __f(comma + 1, args...);
}
#else
#define deb(...)
#endif

  
//////////////////////////////code//////////////////////////////

const int N = 5e3 + 2;

    
int fac[200001];
int inv[200001];

 int power(int a, int b = mod - 2) {
    
  int x = 1 % mod;
  a %= mod;
  b %= mod - 1;
  while (b) {
      
    if (b & 1) x = (x * a)%mod;
    a = (a * a)%mod;
    b >>= 1;
    
  //  deb(x);
  }
 
  
  return x;
  
}

int ncr(int n, int r)
{
  int ans1 = fac[n];
  int ans2 = (inv[r] * inv[n - r]) % mod;

  ans1 = (ans1 * ans2) % mod;

  return ans1;
}

void fillfac()
{
    fac[0] = inv[0] = 1;

  for (int i = 1; i < 200001; ++i)
  {
    fac[i] = (fac[i - 1] * i) % mod;
    inv[i] = power(fac[i]);
  }

}



int n,m;
int dp[14][N];
int cal[N];

int sol(int i,int j)
{
        if(i == 13)
        {
                if(j == 0)
                  return 1;
                else
                  return 0;
        }

        if(dp[i][j] != -1)
          return dp[i][j]; 
        
        int num = pow(2,i);

        int ans = 0;

    
        for(int k = 0;k <= n; k += 2)
        {
                if(j - num * k < 0)
                  break;
                
            
                int val = (cal[k] * sol(i + 1,j - num * k));

                ans += val;
                ans %= mod;
            
        }



        return dp[i][j] = (ans)%mod;

}


void solve()
{

      cin >> n >> m;
      memset(dp,-1,sizeof(dp));

      fillfac();

      for(int i = 0;i < N ;i++ )
      {
            cal[i] = ncr(n,i);

      }

   //   deb(cal[1],cal[2],cal[3],cal[4]);

      int ans = sol(0,m);

      db(ans)

  

}

int32_t main()
{   

    LETS_GET_SCHWIFTY;

     #ifndef ONLINE_JUDGE
     freopen("INP.txt", "r", stdin);
     freopen("out.txt", "w", stdout);
     #endif  


    int t = 1;
   //cin >> t;

    while (t--)
        solve();

}

// check out for following mistakes-
// if using pb operation on vector and then trying to access index..check if sizeof that vec could remain 0 only
// is using prime sieve make sure it fits
// when using factorial template or combinatorics make sure that you edit fillfac fun values and array values

