#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
void read(int &x){
	static char c;
	while(!isdigit(c=getchar())); x=c^48;
	while(isdigit(c=getchar()))x=(x*10)+(c^48);
}
void read(ll &x){
	static char c;
	while(!isdigit(c=getchar())); x=c^48;
	while(isdigit(c=getchar()))x=(x*10)+(c^48);
}
void chkmax(int &x,int y){if(y>x)x=y;}
void chkmin(int &x,int y){if(y<x)x=y;}
void chkmax(ll &x,ll y){if(y>x)x=y;}
void chkmin(ll &x,ll y){if(y<x)x=y;}

const int N=5e3+10,Mod=998244353;
void Add(int &x,int y){(x+=y)>=Mod?x-=Mod:x;}
int Pow(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=1ll*res*a%Mod;
		a=1ll*a*a%Mod,b>>=1;
	}
	return res;
}

int n,m;
int F[15][N],C[N][N];

int Calc(int dep,int k){
	if(dep==0)
		if((k&1)||k>n) return 0;
		else return C[n][k];
	if(~F[dep][k]) return F[dep][k];
	int res=0,dig=(m>>(dep-1))&1;
	for(int i=0;i<=k/2;++i) Add(res,1ll*C[n][2*i]*Calc(dep-1,2*(k-2*i)+dig)%Mod);
	return F[dep][k]=res;
}

void Work(){
	memset(F,-1,sizeof F);
	read(n),read(m);
	if(m==1) return puts("0"),void();
	int Bit=log2(m);
	C[0][0]=1;
	for(int i=1;i<=n;++i) C[i][0]=1;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=i;++j)
			C[i][j]=(C[i-1][j-1]+C[i-1][j])%Mod;
	printf("%d\n",Calc(Bit-1,2+((m>>(Bit-1))&1)));
}

int main(){Work();}

#include <bits/stdc++.h>
using namespace std;

#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()

#define int long long
const int MOD=998244353;

int dp[15][1000001];
int pw(int n,int k){
  assert(k>=0);
  int res=1;
  while(k){
    if(k&1)(res*=n)%=MOD;
    (n*=n)%=MOD;
    k>>=1;
  }
  return res;
}
int Factorial[5000000],Finverse[5000000];
inline void Cinit(){
  Factorial[0]=1;
  for(int i=1;i<5e6;i++)Factorial[i]=(Factorial[i-1]*i)%MOD;
  Finverse[4999999]=pw(Factorial[4999999],MOD-2);
  for(int i=4999998;i>=0;i--)Finverse[i]=(i+1)*Finverse[i+1]%MOD;
}

int memo[5001][5001];
int nCk(int n,int k){
  if(n<k)return 0;if(k<0)return 0;
  if(!Factorial[0])Cinit();
  if(~memo[n][k])return memo[n][k];
  int res=Factorial[n];
  (res*=Finverse[k])%=MOD;
  (res*=Finverse[n-k])%=MOD;
  return memo[n][k]=res;
}

signed main(){
  memset(memo,-1,sizeof(memo));
  int n,m;cin>>n>>m;
  dp[0][0]=1;
  for(int i=0;i<14;i++){
    for(int j=0;j<1000000;j++){
      if(((m>>i)&1)^(j&1))continue;
      if(dp[i][j]==0)continue;
      int s=j/2;//上に繰り上がる予約
      for(int k=0;2*k<=n;k++){//k新たに繰り上げる
        //n個のうち2k個が1
        (dp[i+1][s+k]+=dp[i][j]*nCk(n,2*k)%MOD)%=MOD;
      }
    }
  }
  cout<<dp[14][0]<<endl;
}
