#include using namespace std; using ll = long long; using i128 = __int128; using pll = pair; using vll = vector; template using max_heap = priority_queue; template using min_heap = priority_queue, greater<>>; constexpr ll INF = (1LL << 60); ll ALPHABET_N = 26; #define rep(i, n) for (ll i = (ll)0; i < (ll)n; i++) #define rep_(i, k, n) for (ll i = (ll)k; i < (ll)n; i++) #define rrep(i, n) for (ll i = (ll)(n) - 1; i >= 0; i--) #define all(a) a.begin(), a.end() template bool chmax(T &a, const T &b) { if (a < b) { a = b; return true; } return false; } template bool chmin(T &a, const T &b) { if (a > b) { a = b; return true; } return false; } #include using namespace atcoder; using mint = modint998244353; int main() { ios::sync_with_stdio(false); cin.tie(0); ll n, m; cin >> n >> m; auto large_comb = [](mint n, mint r, ll loop) -> mint { mint a = 1; mint b = 1; rep(_, loop) { a *= (n - _); b *= (r - _); } return a / b; }; if (n < 30) { ll lim = 1LL << (n - 1); if (lim < m) { mint a = mint(2).pow(n) - 1; cout << large_comb(a, m, m).val() << endl; return 0; } } mint a = mint(2).pow(n) - 1; mint b = mint(2).pow(n - 1); mint ans = large_comb(a, m, m) - large_comb(b, m, m) * (mint(2).pow(n) - 1); cout << ans.val() << endl; return 0; }