//    _        _   __
//   (_)      | | / /
//    __ ___  | |/ / ___    ____
//   | |/ _ `\|   | / _ `\ / _  \
//   | | (_) | |\ \| (_) || (_) |
//   | |\__,_|_| \_\\__,_|\____/
// _/ |
//|__/
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353LL
#define endl '\n'
using namespace std;

mt19937 gen(time(0));

int n,m,maxn=0;
ll dp[2][505][515];	// len,last,xor
ll prefix[505][515];

int main(){
	ios::sync_with_stdio(0);cin.tie(0);
	ll ans=0,tmp;
	cin>>n>>m;
	tmp=m;
	while(tmp){
		maxn++;
		tmp>>=1;
	}
	maxn=(1<<maxn)-1;
	for(int i=0;i<=m;i++){
		dp[1][i][i]=1;
	}
	for(int i=2;i<=n;i++){
		memset(prefix,0,sizeof(prefix));
		for(int j=0;j<=m;j++){
			for(int k=0;k<=maxn;k++){
				dp[i&1][j][k]=0;
			}
		}
		for(int j=0;j<=m;j++){
			for(int k=0;k<=maxn;k++){
				if(j)
					prefix[j][k]=dp[~i&1][j][k]+prefix[j-1][k];
				else
					prefix[j][k]=dp[~i&1][j][k];
			}
		}
		for(int j=0;j<=m;j++){
			for(int k=0;k<=maxn;k++){
				dp[i&1][j][k]+=prefix[j][j^k];
				dp[i&1][j][k]%=mod;
			}
		}
	}
	for(int i=0;i<=m;i++){
		ans+=dp[n&1][i][m];
		ans%=mod;
	}
	cout<<ans<<endl;
	return 0;
}
/*
dp[i][j][k]=dp[i-1][x][x^k] (0<=x<=j,x=j^k)
*/
