#include <bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 16) + 5;
const int MOD = 998244353;
const int Gi = 3, Ginv = 332748118;
template <typename T>
inline void read(T &AKNOI) {
  T x = 0, flag = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') flag = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  AKNOI = flag * x;
}
int n, m, len, linv, rev[MAXN], w1[MAXN], w2[MAXN];
int f[MAXN], g[MAXN], A[MAXN], B[MAXN], F[MAXN], G[MAXN], H[MAXN];
namespace ModCalculator {
inline void Inc(int &x, int y) {
  x += y;
  if (x >= MOD) x -= MOD;
}
inline void Dec(int &x, int y) {
  x -= y;
  if (x < 0) x += MOD;
}
inline int Add(int x, int y) {
  Inc(x, y);
  return x;
}
inline int Sub(int x, int y) {
  Dec(x, y);
  return x;
}
inline int Mul(int x, int y) { return 1LL * x * y % MOD; }
}  // namespace ModCalculator
using namespace ModCalculator;
inline int ksm(int x, int k) {
  int ret = 1;
  while (k) {
    if (k & 1) ret = Mul(ret, x);
    x = Mul(x, x);
    k >>= 1;
  }
  return ret;
}
void NTT_init(int N) {
  int bit = -1;
  for (len = 1; len <= N; len <<= 1) ++bit;
  linv = ksm(len, MOD - 2);
  for (int i = 0; i < len; ++i) {
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << bit);
  }
  for (int i = 1; i < len; i <<= 1) {
    long long wn1 = ksm(Gi, (MOD - 1) / (i << 1)), wnk1 = 1;
    long long wn2 = ksm(Ginv, (MOD - 1) / (i << 1)), wnk2 = 1;
    for (int k = 0; k < i; ++k) {
      w1[i + k] = wnk1;
      wnk1 = Mul(wnk1, wn1);
      w2[i + k] = wnk2;
      wnk2 = Mul(wnk2, wn2);
    }
  }
}
void NTT(int *a, int type) {
  int *w = (type == 1) ? w1 : w2;
  for (int i = 0; i < len; ++i) {
    if (i < rev[i]) {
      swap(a[i], a[rev[i]]);
    }
  }
  for (int i = 1; i < len; i <<= 1) {
    for (int j = 0; j < len; j += (i << 1)) {
      for (int k = 0; k < i; ++k) {
        int x = a[j + k], y = Mul(w[i + k], a[j + k + i]);
        a[j + k] = Add(x, y);
        a[j + k + i] = Sub(x, y);
      }
    }
  }
  if (type == 1) return;
  for (int i = 0; i < len; ++i) {
    a[i] = Mul(a[i], linv);
  }
}
void Calc() {
  for (int i = m + 1; i < len; ++i) {
    f[i] = g[i] = 0;
  }
  NTT(f, 1);
  NTT(g, 1);
  for (int i = 0; i < len; ++i) {
    F[i] = Mul(f[i], f[i]);
    G[i] = Mul(g[i], g[i]);
    H[i] = Mul(2, Mul(f[i], g[i]));
  }
  NTT(F, -1);
  NTT(G, -1);
  NTT(H, -1);
  for (int i = 0; i <= m; ++i) {
    f[i] = Sub(H[i], Add(F[i], F[i - 1]));
    g[i] = Add(F[i - 1], G[i]);
  }
  f[0] = g[0] = 1;
}
void Brute() {
  for (int i = m; i >= 1; --i) {
    f[i] = g[i];
    Inc(g[i], Add(g[i - 1], f[i - 1]));
  }
  f[0] = g[0] = 1;
}
void Work(int k) {
  if (k == 1) return;
  Work(k >> 1);
  Calc();
  if (k & 1) Brute();
}
void solve() {
  read(n);
  read(m);
  NTT_init(m << 1);
  f[0] = 1;
  g[0] = g[1] = 1;
  Work(n);
  for (int i = 1; i <= m; ++i) {
    printf("%d ", g[i]);
  }
}
int main() {
  solve();
  return 0;
}
