#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
#define reps(i,s,n) for(int i=(s); i<(n); i++)
#define all(v) v.begin(),v.end()
#define outve(v) for(auto i : v) cout << i << " ";cout << endl
#define outmat(v) for(auto i : v){for(auto j : i) cout << j << " ";cout << endl;}
#define in(n,v) for(int i=0; i<(n); i++){cin >> v[i];}
#define out(n) cout << (n) << endl
#define fi first
#define se second
#define pb push_back
#define si(v) int(v.size())
#define len(v) int(v.length())
#define lob(v,n) lower_bound(all(v),n)
#define lobi(v,n) lower_bound(all(v),n) - v.begin()
#define upb(v,n) upper_bound(all(v),n)
#define upbi(v,n) upper_bound(all(v),n) - v.begin()
#define mod 998244353
#define infi 1010000000
#define infl 1100000000000000000
#define cyes cout << "Yes" << endl
#define cno cout << "No" << endl
#define csp << " " <<
#define outset(n) cout << fixed << setprecision(n);
using namespace std;
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vd = vector<double>;
using vvd = vector<vector<double>>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
template<typename T> using ve = vector<T>;
template<typename T> using pq2 = priority_queue<T>;
template<typename T> using pq1 = priority_queue<T,vector<T>,greater<T>>;
template<typename T> bool chmax(T &a, T b) {if(a < b) {a = b;return 1;}return 0;}
template<typename T> bool chmin(T &a, T b) {if(a > b) {a = b;return 1;}return 0;}



class Combination {
    vl fac,finv,inv;
public:
    Combination(ll n) {
        n++;
        fac.resize(n);finv.resize(n);inv.resize(n);
        
        fac[0] = fac[1] = 1;
        finv[0] = finv[1] = 1;
        inv[1] = 1;
        reps(i,2,n){
            fac[i] = fac[i-1]*(ll)i%mod;
            inv[i] = (ll)mod - inv[mod%i]*(ll)(mod/i)%mod;
            finv[i] = finv[i-1]*inv[i]%mod;
        }
    }
    
    ll com(ll n, ll m){
        if(n < m) return 0;
        if(n < 0 || m < 0) return 0;
        return fac[n]*(finv[m]*finv[n-m]%mod)%mod;
    }
};



int main(){
    
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N,M;
    cin >> N >> M;
    
    
    Combination C(10000);
    
    
    int n = 14;
    vvl dp(n+1,vl(M+1,0));
    dp[0][0] = 1;
    
    rep(i,n){
        int a = int(1<<i);
        rep(k,M+1){
            dp[i+1][k] += dp[i][k];
            dp[i+1][k] %= mod;
            
            if(dp[i][k] == 0) continue;
            for (int j = 2; j <= N; j += 2) {
                if(a*j+k > M) break;
                
                dp[i+1][a*j+k] += dp[i][k]*C.com((ll)N,(ll)j)%mod;
                dp[i+1][a*j+k] %= mod;
            }
        }
        
    }
    
    cout << dp[n][M] << endl;
    
    

    return 0;
}

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<cstdlib>
#include<utility>
using namespace std;
const int mod=998244353;
int f[17][5000+5],c[5000+5][5000+5];
void add(int &x,int y){x=(x+y)%mod;}
int main()
{
    int n,m,i,j,k,val;
    c[0][0]=c[1][1]=c[1][0]=1;
    for (i=2;i<=5000;i++)
        c[i][0]=1;
    for (i=2;i<=5000;i++)
    {
        for (j=1;j<=i;j++)
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
    }
    scanf("%d%d",&n,&m);
    f[0][0]=1;
    for (i=1;i<=15;i++)
    {
        val=1<<(i-1);
        for (k=0;k<=n&&k*val<=m;k+=2)
            for (j=k*val;j<=m;j++)
                add(f[i][j],1ll*f[i-1][j-k*val]*c[n][k]%mod);
    }
    printf("%d\n",f[15][m]);
}
