#include <bits/stdc++.h>
using namespace std;
long long n, m, k;
const long long mod = 998244353;
const long long G = 3;
const long long maxn = 300001;
long long read() {
  long long s = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    s = s * 10 + ch - '0';
    ch = getchar();
  }
  return s * f;
}
long long read2() {
  long long x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = (1ll * x * 10 + ch - '0') % mod, ch = getchar();
  return x;
}
inline void print(long long *f, long long len) {
  for (long long i = 0; i < len; i++) printf("%lld ", f[i]);
  puts("");
}
long long qpow(long long a, long long b = mod - 2) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = ans * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return ans;
}
const long long invG = qpow(G);
long long tr[maxn], f[7][maxn], g[7][maxn], invn, trs;
long long inv[maxn];
void poly_pre(long long n) {
  if (trs == n) return;
  trs = n;
  for (long long i = 0; i < n; ++i)
    tr[i] = (tr[i >> 1] >> 1) | ((i & 1) ? n >> 1 : 0);
}
void ntt(long long *f, long long n, bool op) {
  poly_pre(n);
  for (long long i = 0; i < n; ++i) {
    if (i < tr[i]) swap(f[i], f[tr[i]]);
  }
  for (long long p = 2; p <= n; p <<= 1) {
    long long len = (p >> 1);
    long long bas = qpow(op == 1 ? G : invG, (mod - 1) / p);
    for (long long k = 0; k < n; k += p) {
      long long buf = 1;
      for (long long l = k; l < k + len; ++l) {
        long long kk = buf * f[l + len] % mod;
        f[l + len] = f[l] - kk;
        if (f[len + l] < 0) f[len + l] += mod;
        f[l] = f[l] + kk;
        f[l] %= mod;
        buf *= bas, buf %= mod;
      }
    }
  }
  if (!op) {
    long long invn = qpow(n);
    for (long long i = 0; i < n; ++i) f[i] = (f[i] * invn) % mod;
  }
}
void poly_mul(long long *f, long long *g, long long n) {
  for (long long i = 0; i <= n; ++i) f[i] = f[i] * g[i] % mod;
}
void times(long long *f, long long *g, long long len, long long lim) {
  static long long sav[maxn << 1];
  long long n;
  for (n = 1; n < len + len; n <<= 1)
    ;
  memset(sav, 0, sizeof(long long) * (n)),
      memcpy(sav, g, sizeof(long long) * (n));
  ntt(f, n, 1), ntt(sav, n, 1);
  poly_mul(f, sav, n);
  ntt(f, n, 0);
  memset(f + lim, 0, sizeof(long long) * (n - lim)),
      memset(sav, 0, sizeof(long long) * (n));
}
long long w[maxn], r[maxn], sav[maxn];
void poly_inv(long long *f, long long m) {
  long long n;
  for (n = 1; n < m; n <<= 1)
    ;
  w[0] = qpow(f[0]);
  for (long long len = 2; len <= n; len <<= 1) {
    for (long long i = 0; i < (len >> 1); ++i) {
      r[i] = (w[i] << 1) % mod;
    }
    memcpy(sav, f, sizeof(long long) * (len));
    ntt(w, len << 1, 1);
    ntt(sav, len << 1, 1);
    poly_mul(w, w, len << 1), poly_mul(w, sav, len << 1);
    ntt(w, len << 1, 0);
    for (long long i = 0; i < len; i++) w[i] = (r[i] - w[i] + mod) % mod;
    memset(w + len, 0, sizeof(long long) * (len));
  }
  memcpy(f, w, sizeof(long long) * (m));
  memset(sav, 0, sizeof(long long) * (n << 1)),
      memset(w, 0, sizeof(long long) * (n << 1)),
      memset(r, 0, sizeof(long long) * (n << 1));
  return;
}
long long b1[maxn << 1], b2[maxn << 1];
void poly_sqrt(long long *f, long long m) {
  long long n;
  for (n = 1; n <= m; n <<= 1)
    ;
  b1[0] = 1;
  for (long long len = 2; len <= n; len <<= 1) {
    for (long long i = 0; i < (len >> 1); ++i) {
      b2[i] = (b1[i] << 1) % mod;
    }
    poly_inv(b2, len);
    ntt(b1, len, 1);
    poly_mul(b1, b1, len);
    ntt(b1, len, 0);
    for (long long i = 0; i < len; ++i) {
      b1[i] = (b1[i] + f[i]) % mod;
    }
    times(b1, b2, len, len);
  }
  memcpy(f, b1, sizeof(long long) * (m));
  memset(b1, 0, sizeof(long long) * (n << 1)),
      memset(b2, 0, sizeof(long long) * (n << 1));
}
void poly_dao(long long *f, long long m) {
  for (long long i = 1; i < m; ++i) {
    f[i - 1] = f[i] * 1ll * i % mod;
  }
  f[m - 1] = 0;
}
void initmath(long long lim) {
  inv[1] = 1;
  for (long long i = 2; i <= lim; i++)
    inv[i] = 1ll * inv[mod % i] * (mod - mod / i) % mod;
}
void poly_jifen(long long *f, long long m) {
  for (long long i = m; i; --i) {
    f[i] = 1ll * f[i - 1] * inv[i] % mod;
  }
  f[0] = 0;
}
void poly_ln(long long *f, long long m) {
  static long long g[maxn << 1];
  memcpy(g, f, sizeof(long long) * (m));
  poly_inv(g, m);
  poly_dao(f, m);
  times(f, g, m, m);
  poly_jifen(f, m - 1);
  memset(g, 0, sizeof(long long) * (m));
}
void poly_exp(long long *f, long long m) {
  static long long s1[maxn], s2[maxn];
  long long n = 1;
  for (n = 1; n <= m; n <<= 1)
    ;
  s2[0] = 1;
  for (long long len = 2; len <= n; len <<= 1) {
    memcpy(s1, s2, sizeof(long long) * (len >> 1));
    poly_ln(s1, len);
    for (long long i = 0; i < len; ++i) {
      s1[i] = (f[i] - s1[i] + mod) % mod;
    }
    s1[0]++;
    s1[0] %= mod;
    times(s2, s1, len, len);
  }
  memcpy(f, s2, sizeof(long long) * (m));
  memset(s1, 0, sizeof(long long) * (n)),
      memset(s2, 0, sizeof(long long) * (n));
}
void poly_pow(long long *f, long long m, long long k) {
  poly_ln(f, m);
  for (long long i = 0; i < m; ++i) f[i] = (f[i] * k) % mod;
  poly_exp(f, m);
}
void poly_div(long long *f, long long *g, long long n, long long m) {
  static long long q[maxn], t[maxn];
  long long len = n - m + 1;
  reverse(g, g + m);
  memcpy(q, g, sizeof(long long) * (len));
  reverse(g, g + m);
  reverse(f, f + n);
  memcpy(t, f, sizeof(long long) * (len));
  reverse(f, f + n);
  poly_inv(q, len);
  times(q, t, len, len);
  reverse(q, q + len);
  times(g, q, n, n);
  for (long long i = 0; i < m - 1; ++i) g[i] = (f[i] - g[i] + mod) % mod;
  memset(g + m + 1, 0, sizeof(long long) * (len));
  memcpy(f, q, sizeof(long long) * (len));
  memset(f + len, 0, sizeof(long long) * (n - len));
}
void solve(long long nw) {
  long long cnt = 1, lim = 0;
  while (cnt <= nw * 2) {
    cnt <<= 1;
    lim++;
  }
  lim--;
  for (long long i = 0, iend = cnt - 1; i <= iend; ++i) {
    g[0][i] = g[1][i] = g[2][i] = g[3][i] = g[4][i] = 0;
  }
  ntt(f[0], cnt, 1);
  ntt(f[1], cnt, 1);
  ntt(f[2], cnt, 1);
  for (long long i = 0, iend = cnt - 1; i <= iend; ++i) {
    g[0][i] = f[0][i] * f[0][i] % mod;
    g[1][i] = f[1][i] * f[1][i] % mod;
    g[2][i] = f[2][i] * f[2][i] % mod;
    g[3][i] = f[0][i] * f[1][i] % mod;
    g[4][i] = f[1][i] * f[2][i] % mod;
    f[0][i] = 0;
    f[1][i] = 0;
    f[2][i] = 0;
  }
  for (long long i = 0, iend = 4; i <= iend; ++i) ntt(g[i], cnt, 0);
  for (long long i = 0, iend = cnt - 1; i <= iend; ++i) {
    f[0][i] = g[0][i];
    if (i) f[0][i] += g[1][i - 1];
    f[1][i] = g[3][i];
    if (i) f[1][i] += g[4][i - 1];
    f[2][i] = g[1][i];
    if (i) f[2][i] += g[2][i - 1];
    f[0][i] %= mod;
    f[1][i] %= mod;
    f[2][i] %= mod;
  }
  for (long long i = 0, iend = cnt - 1; i <= iend; ++i) {
    g[0][i] = g[1][i] = g[2][i] = g[3][4] = g[4][i] = 0;
  }
  for (long long i = nw, iend = cnt - 1; i <= iend; ++i)
    f[0][i] = f[1][i] = f[2][i] = 0;
  return;
}
void change(long long nw) {
  for (long long i = 0, iend = nw - 1; i <= iend; ++i) {
    f[2][i] = f[1][i];
    f[1][i] = f[0][i];
    f[0][i] = 0;
  }
  f[0][0] = 1;
  for (long long i = 1, iend = nw - 1; i <= iend; ++i) {
    f[0][i] = (f[1][i - 1] + f[2][i - 1] + f[1][i]) % mod;
  }
  return;
}
signed main() {
  n = read(), k = read();
  f[0][0] = 1;
  f[1][0] = f[0][1] = 1;
  long long lim = log2(n);
  for (long long i = lim - 1, iend = 0; i >= iend; --i) {
    solve(k + 10);
    if (n & (1 << i)) {
      change(k + 10);
    }
  }
  for (long long i = 1, iend = k; i <= iend; ++i) printf("%lld ", f[0][i]);
}
