#include <bits/stdc++.h>
const int G = 3;
const int K = 40001;
const int inv2 = 499122177;
const int MaxN = 6e5 + 10;
const int mod = 998244353;
int n, k, lim, w[MaxN], rev[MaxN], _inv[MaxN];
void Mod(int &x) { x += x >> 31 & mod; }
void __init() {
  _inv[1] = 1;
  for (int i = 2; i < MaxN; i++)
    _inv[i] = (unsigned long long)(mod - mod / i) * _inv[mod % i] % mod;
}
int fast_pow(int a, int b) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = (unsigned long long)ret * a % mod;
    a = (unsigned long long)a * a % mod, b >>= 1;
  }
  return ret;
}
void init(int n) {
  int l = 32 - __builtin_clz(n - 1);
  lim = (1 << l);
  for (int i = 0, ri = 0; i < lim; i++) {
    rev[i] = ri;
    for (int k = lim >> 1; (ri ^= k) < k;) k >>= 1;
  }
  int wn = fast_pow(G, (mod - 1) >> l);
  w[lim >> 1] = 1;
  for (int i = (lim >> 1) + 1; i < lim; i++)
    w[i] = (unsigned long long)w[i - 1] * wn % mod;
  for (int i = (lim >> 1) - 1; i; --i) w[i] = w[i << 1];
  lim = l;
}
struct poly {
  std::vector<int> v;
  inline poly() {}
  inline poly(int n) : v(n) {}
  inline poly(const poly &r) : v(r.v) {}
  inline poly(const std::vector<int> &r) : v(r) {}
  inline size_t size() { return v.size(); }
  inline bool empty() { return v.empty(); }
  inline void resize(int n) { v.resize(n); }
  inline void clear() { v.clear(); }
  inline void shl() { v.insert(v.begin(), 0); }
  void shrink() {
    while (!v.empty() && !v.back()) v.pop_back();
  }
  inline int &operator[](int i) { return v[i]; }
  inline static int len(int n) { return 1 << (32 - __builtin_clz(n - 1)); }
  void deriv() {
    for (int i = 1; i < v.size(); i++)
      v[i - 1] = (unsigned long long)i * v[i] % mod;
    v.pop_back();
  }
  void intg() {
    shl();
    for (int i = 1; i < v.size(); i++)
      v[i] = (unsigned long long)v[i] * _inv[i] % mod;
  }
  void dft(int n) {
    static unsigned long long tmp[MaxN];
    int ofs = lim - __builtin_ctz(n);
    resize(n);
    if (n <= 1) return;
    for (int i = 0; i < n; i++) tmp[rev[i] >> ofs] = v[i];
    for (int i = 0; i < n; i += 2) {
      int x = tmp[i], y = tmp[i + 1];
      tmp[i] = x + y, tmp[i + 1] = x + mod - y;
    }
    for (int i = 2; i < n; i <<= 1)
      for (int j = 0; j < n; j += (i << 1))
        for (int k = 0; k < i; ++k) {
          int y = (unsigned long long)tmp[i + j + k] * w[i + k] % mod;
          tmp[i + j + k] = tmp[j + k] + mod - y, tmp[j + k] += y;
        }
    for (int i = 0; i < n; i++) v[i] = tmp[i] % mod;
  }
  void idft(int n) {
    dft(n);
    if (n <= 1) return;
    std::reverse(v.begin() + 1, v.end());
    int tmp = mod - (mod - 1) / n;
    for (int i = 0; i < n; i++) v[i] = (unsigned long long)v[i] * tmp % mod;
  }
  void mul(int k) {
    int n = size();
    for (int i = 0; i < n; i++)
      v[i] = (unsigned long long)(v[i] * k % mod + mod) % mod;
  }
  void add(poly r) {
    int n = std::max(size(), r.size());
    resize(n);
    for (int i = 0; i < n; i++) v[i] = (unsigned long long)(v[i] + r[i]) % mod;
    shrink();
  }
  void mul(poly r) {
    int n = len(size() + r.size() - 1);
    dft(n), r.dft(n);
    for (int i = 0; i < n; i++) v[i] = (unsigned long long)v[i] * r[i] % mod;
    idft(n), shrink();
  }
  void inv() {
    std::vector<int> va(1);
    int n = size(), m = len(n);
    va[0] = fast_pow(v[0], mod - 2);
    poly a;
    v.resize(m), v.swap(va);
    for (int i = 1; i <= m; i <<= 1) {
      a.resize(i);
      for (int j = 0; j < i; j++) a[j] = va[j];
      a.dft(i << 1), dft(i << 1);
      for (int j = 0; j < (i << 1); j++)
        v[j] = v[j] * (2 + mod - (unsigned long long)v[j] * a[j] % mod) % mod;
      idft(i << 1), resize(i);
    }
    resize(n);
  }
  void ln() {
    poly f0 = *this;
    int n = size();
    deriv(), f0.inv(), mul(f0);
    resize(n), intg(), resize(n);
  }
  void exp() {
    std::vector<int> va(1);
    va[0] = 1;
    poly a;
    int n = size(), m = len(n);
    v.resize(m), v.swap(va);
    for (int i = 1; i <= m; i *= 2) {
      a = *this, a.resize(i), a.ln();
      for (int j = 0; j < i; j++) a[j] = (va[j] + !j + mod - a[j]) % mod;
      mul(a), resize(i);
    }
    resize(n);
  }
  void pw(int k) {
    ln();
    int n = size();
    for (int i = 0; i < n; i++) v[i] = (unsigned long long)v[i] * k % mod;
    exp();
  }
  void sqrt() {
    std::vector<int> va(1);
    int n = size(), m = len(n);
    poly a, b;
    va[0] = ::sqrt(v[0]);
    v.resize(m), v.swap(va);
    for (int i = 1; i <= m; i <<= 1) {
      a.resize(i), b.resize(i);
      for (int j = 0; j < i; j++) a[j] = va[j], b[j] = v[j];
      b.inv(), a.mul(b);
      for (int j = 0; j < i; j++)
        v[j] = (unsigned long long)(v[j] + a[j]) % mod * inv2 % mod;
      resize(i << 1);
    }
    resize(n);
  }
} a, b, c, f, g, h;
void extend() {
  f = g, g = h, h[0] = g[0];
  f.resize(K), g.resize(K), h.resize(K);
  for (int i = 1; i < K; i++)
    h[i] = (((f[i - 1]) + ((((g[i - 1]) + (g[i])) % mod))) % mod);
}
void Double() {
  int len = poly::len(2 * K), A, B, C, w = 1, wn = fast_pow(3, (mod - 1) / len);
  a = f, a.dft(len), b = g, b.dft(len), c = h, c.dft(len);
  for (int i = 0; i < len; i++, w = (unsigned long long)w * wn % mod) {
    A = a[i], B = b[i], C = c[i];
    a[i] =
        (unsigned long long)(1ll * B * B % mod + 1ll * A * A % mod * w % mod) %
        mod;
    b[i] =
        (unsigned long long)(1ll * B * C % mod + 1ll * A * B % mod * w % mod) %
        mod;
    c[i] =
        (unsigned long long)(1ll * C * C % mod + 1ll * B * B % mod * w % mod) %
        mod;
  }
  a.idft(len), f = a, b.idft(len), g = b, c.idft(len), h = c;
  f.resize(K), g.resize(K), h.resize(K);
}
inline int read() {
  unsigned long long x = 0;
  char ch = getchar();
  while (ch > '9' || ch < '0') ch = getchar();
  while (ch <= '9' && ch >= '0') x = ((x * 10) + (ch ^ 48)), ch = getchar();
  return x;
}
signed main() {
  __init(), init(300000), n = read(), k = read(), f.resize(K);
  g.resize(K), h.resize(K), g[0] = 1, h[0] = 1, h[1] = 1;
  int lg = log2(n);
  for (int i = lg - 1; ~i; i--) {
    Double();
    if (n & (1 << i)) extend();
  }
  for (int i = 1; i <= k; i++) printf("%d ", h[i]);
  return 0;
}
