#include<iostream>
#include<vector>
#include<algorithm>
#include<cassert>

using namespace std;

template< int mod >
struct ModInt {
  int x;

  ModInt() : x(0) {}

  ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}
  
  ModInt &operator+=(const ModInt &p) {
    if((x += p.x) >= mod) x -= mod;
    return *this;
  }
  ModInt &operator-=(const ModInt &p) {
    if((x += mod - p.x) >= mod) x -= mod;
    return *this;
  }
  ModInt &operator*=(const ModInt &p) {
    x = (int) (1LL * x * p.x % mod);
    return *this;
  }
  ModInt &operator/=(const ModInt &p) {
    *this *= p.inverse();
    return *this;
  }
  ModInt operator-() const { return ModInt(-x); }
  ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
  ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
  ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
  ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
  bool operator==(const ModInt &p) const { return x == p.x; }
  bool operator!=(const ModInt &p) const { return x != p.x; }

  ModInt inverse() const {
    int a = x, b = mod, u = 1, v = 0, t;
    while(b > 0) {
      t = a / b;
      swap(a -= t * b, b);
      swap(u -= t * v, v);
    }
    return ModInt(u);
  }
  ModInt pow(int64_t n) const {
    ModInt ret(1), mul(x);
    while(n > 0) {
      if(n & 1) ret *= mul;
      mul *= mul;
      n >>= 1;
    }
    return ret;
  }
  friend ostream &operator<<(ostream &os, const ModInt &p) {
    return os << p.x;
  }
  friend istream &operator>>(istream &is, ModInt &a) {
    int64_t t;
    is >> t;
    a = ModInt< mod >(t);
    return (is);
  }
  static int get_mod() { return mod; }
};
constexpr int MOD = 998244353;
using mint = ModInt< MOD >;

template<typename T>
struct Combination{
  // T は mint の想定です
  int N;
  vector<T> fact_, inv_, finv_;

  Combination(){}
  Combination(int n):N(n+1), fact_(N,1), inv_(N,1), finv_(N,1){
    int mod = fact_.at(0).get_mod();

    for (int i = 2; i < N; i++){
      fact_.at(i) = fact_.at(i-1) * i;
      inv_.at(i) = -inv_.at(mod%i) * (mod/i);
      finv_.at(i) = finv_.at(i-1) * inv_.at(i);
    }
  }

  void init(int n) {
    N = n+1;
    fact_.assign(N, 1);
    inv_.assign(N, 1);
    finv_.assign(N, 1);

    int mod = fact_.at(0).get_mod();

    for (int i = 2; i < N; i++){
      fact_.at(i) = fact_.at(i-1) * i;
      inv_.at(i) = -inv_.at(mod%i) * (mod/i);
      finv_.at(i) = finv_.at(i-1) * inv_.at(i);
    }
  }

  T fact(int n){
    if(n < 0) return 0;
    assert(n<N);
    return fact_.at(n);
  }
  T inv(int n){
    if(n < 0) return 0;
    assert(n<N);
    return inv_.at(n);
  }
  T finv(int n){
    if(n < 0) return 0;
    assert(n<N);
    return finv_.at(n);
  }

  T com(int n, int k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    assert(n<N);
    return fact_.at(n) * finv_.at(k) * finv_.at(n-k);
  }

  T parm(int n, int k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    assert(n<N);
    return fact_.at(n) *finv_.at(n-k);
  }

  T hom(int n, int k){
    if(n < 0 || k < 0) return 0;
    if(k == 0) return 1;
    assert(n+k-1<N);
    return com(n+k-1, k);
  }
};

int main(){
  int n, m; cin >> n >> m;
  /*
  dp_ij = 二進法でi桁目まで見て合計をjにするような方法
  i桁目でいくつbitを立てるか(偶数個)を全探索


  メモ化再帰:
  2^0の位をいくつ立てるかを全探索すると、
  (m - cnt)/2 のサイズの同じ問題にできる
  //*/

  Combination<mint> bc(n);
  vector<mint> memo(m+1);
  vector<bool> seen(m+1);

  auto dp = [&](auto f, int sum) -> mint{
    if(sum == 0) return 1;
    if(sum&1) return 0;
    if(seen[sum]) return memo[sum];
    seen[sum] = 1;
    mint res = 0;

    for(int i = 0; i*2 <= sum && i*2 <= n; i++){
      res += f(f, (sum-i*2)/2) * bc.com(n, i*2);
    }

    return memo[sum] = res;
  };

  cout << dp(dp, m) << endl;
}
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>

using namespace std;
using ll = long long;
using ull = unsigned long long;

template <typename T> void read(T & x){
    x = 0; int op = 1; char ch = getchar();
    while (!isdigit(ch)){ if (ch == '-') op = -1; ch = getchar();}
    while (isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48); ch = getchar();}
    x*= op;
}

signed main(){
    ios::sync_with_stdio(false);
    int a, b;
    cin >> a >> b;
    int sum = 0;
    for (int i = 0; i < b; ++i) {
        int t = -900000 - i;
        cout << t << " ";
        sum += t;
    }
    for (int i = 1; i < a; ++i) {
        cout << i << " ";
        sum += i;
    }
    cout << -sum << endl;
}