#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = INT_MAX / 2;
const ll infl = 1LL << 60;
#define rep(i,b) for(ll i=0;i<b;i++)
#define rrep(i,a,b) for(ll i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
///#pragma GCC target("avx2")
///#pragma GCC optimize("O3")
///#pragma GCC optimize("unroll-loops")
ll input(){
    ll  n;
    cin >> n;
    return n;
}///input関数
ll combination(ll n,ll r){
    if (r == 0 || r == n)
        return (1);
    else if (r == 1)
        return (n);
    return (combination(n-1,r-1) + combination(n-1,r));

}///nCr
ll facctorialMethod(ll k){
    ll sum = 1;
    for (ll i = 1; i <= k; ++i)
    {
        sum *= i;
    }
    return sum;
}///階乗
void num_change(ll &a, ll &b){
    swap(a,b);
}
void top3(ll &no1,ll &no2,ll cha){
    if (cha>no2&&cha!=no1)num_change(cha,no2);
    if (no2>no1)num_change(no1,no2);
}
/*
int main() {
    ll n = input();
    vector<ll>num;
    vector<ll>cnt;
    rep(i,n){
        ll a = input();
        bool flag = true;
        rep(j,num.size()){
            if(num.at(j) == a){
                cnt.at(j)++;
                flag = false;
            }
        }
        if (flag){
            num.push_back(a);
            cnt.push_back(1);
        }
    }
    sort(all(cnt));
    reverse(all(cnt));
    ll ans = n * (n-1)/2;
    fore(i,cnt){
        if(i > 1){
            ans -= (i*(i-1)/2);
        }
        if (i==1){
            break;
        }
    }
    cout << ans << endl;
}*/
int main(){
    ll a = input();
    if (a == 191){
        cout << "so-so";
    }else if (a <191){
        cout << "Yay!";
    }else{
        cout << ":(";
    }
}
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 5050,mod = 998244353;
int n,m,fac[maxn],ifac[maxn],f[2][maxn];
int read(){
	int x = 0;
	char c = getchar();
	while(c < '0' || c > '9') c = getchar();
	while(c >= '0' && c <= '9') x = x * 10 + (c ^ 48),c = getchar();
	return x;
}
inline int add(int x,int y){
	if(x + y < mod) return x + y;
	else return x + y - mod;
}
int qpow(int x,int k){
	int d = 1;
	while(k){
		if(k & 1) d = 1ll * d * x % mod;
		x = 1ll * x * x % mod,k >>= 1;
	}
	return d;
}
void init(int n){
	fac[0] = 1;
	for(int i = 1; i <= n; i ++) fac[i] = 1ll * fac[i - 1] * i % mod;
	ifac[n] = qpow(fac[n],mod - 2);
	for(int i = n - 1; i >= 0; i --) ifac[i] = 1ll * ifac[i + 1] * (i + 1) % mod;
}
int main(){
	n = read(),m = read();
	init(n);
	int cur = 0;
	f[cur][0] = 1;
	for(int k = 1; k <= m; k <<= 1){
		cur ^= 1;
		for(int i = 0; i <= m; i ++){
			f[cur][i] = 0;
			for(int j = 0; j <= n && j * k <= i; j += 2){
				f[cur][i] = add(f[cur][i],1ll * f[cur ^ 1][i - j * k] * fac[n] % mod * ifac[j] % mod * ifac[n - j] % mod);
				// cout << k << ' ' << i << ' ' << f[cur][i] << endl;
			}
		}
	}
	printf("%d\n",f[cur][m]);
	return 0;
}