#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T& x) {
  char c = getchar();
  x = 0;
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
}
template <typename T>
inline void copy(T* l, T* r, T* f) {
  for (T* i = l; i < r; ++i) f[i - l] = *i;
}
const int N = 1 << 17 | 5;
const long long mod = 998244353, G = 3, invG = 332748118;
inline long long fp(long long a, long long b) {
  long long tot = 1;
  for (; b; a = a * a % mod, b >>= 1)
    if (b & 1) tot = tot * a % mod;
  return tot;
}
inline void NTT(long long* f, int n, bool op) {
  static int trs[N], trn;
  if (trn != n) {
    for (int i = 1; i < n; ++i)
      trs[i] = (trs[i >> 1] >> 1) | ((i & 1) ? n >> 1 : 0);
    trn = n;
  }
  for (int i = 1; i < n; ++i)
    if (i < trs[i]) swap(f[i], f[trs[i]]);
  for (int p = 2; p <= n; p <<= 1) {
    int len = p >> 1, o = fp(op ? G : invG, (mod - 1) / p);
    for (int s = 0; s < n; s += p) {
      long long w = 1;
      for (int i = s; i < s + len; ++i, w = w * o % mod) {
        long long tmp = f[i + len] * w % mod;
        f[i + len] = (f[i] - tmp + mod >= mod ? f[i] - tmp + mod - mod
                                              : f[i] - tmp + mod);
        f[i] = (f[i] + tmp >= mod ? f[i] + tmp - mod : f[i] + tmp);
      }
    }
  }
  if (!op) {
    long long inv = fp(n, mod - 2);
    for (int i = 0; i < n; ++i) f[i] = f[i] * inv % mod;
  }
}
inline void poly_add(long long* A, long long* B, long long* C, int n) {
  for (int i = 0; i < n; ++i)
    C[i] = (A[i] + B[i] >= mod ? A[i] + B[i] - mod : A[i] + B[i]);
}
inline void poly_mul(long long* A, long long* B, long long* C, int n) {
  for (int i = 0; i < n; ++i) C[i] = A[i] * B[i] % mod;
}
int n, m, lim;
struct DP {
  long long f0[N], f1[N], f2[N];
  inline DP() {
    memset(f0, 0, sizeof(f0));
    memset(f1, 0, sizeof(f1));
    memset(f2, 0, sizeof(f2));
  }
  inline void DFT() {
    NTT(f0, lim, 1);
    NTT(f1, lim, 1);
    NTT(f2, lim, 1);
  }
} ans;
inline void dbl(DP& A) {
  static DP _A;
  static long long t00[N], t11[N], t22[N], t10[N], t21[N];
  _A = A;
  _A.DFT();
  poly_mul(_A.f0, _A.f0, t00, lim);
  poly_mul(_A.f1, _A.f1, t11, lim);
  poly_mul(_A.f2, _A.f2, t22, lim);
  poly_mul(_A.f1, _A.f0, t10, lim);
  poly_mul(_A.f2, _A.f1, t21, lim);
  NTT(t00, lim, 0);
  NTT(t11, lim, 0);
  NTT(t22, lim, 0);
  NTT(t10, lim, 0);
  NTT(t21, lim, 0);
  copy(t11, t11 + m, A.f0);
  poly_add(t00, A.f0 + 1, A.f0 + 1, m - 1);
  copy(t21, t21 + m, A.f1);
  poly_add(t10, A.f1 + 1, A.f1 + 1, m - 1);
  copy(t22, t22 + m, A.f2);
  poly_add(t11, A.f2 + 1, A.f2 + 1, m - 1);
}
inline void add(DP& A) {
  A.f0[0] = A.f2[0];
  for (int i = 1; i < m; ++i)
    A.f0[i] = ((A.f2[i] + A.f2[i - 1] >= mod ? A.f2[i] + A.f2[i - 1] - mod
                                             : A.f2[i] + A.f2[i - 1]) +
                           A.f1[i - 1] >=
                       mod
                   ? (A.f2[i] + A.f2[i - 1] >= mod ? A.f2[i] + A.f2[i - 1] - mod
                                                   : A.f2[i] + A.f2[i - 1]) +
                         A.f1[i - 1] - mod
                   : (A.f2[i] + A.f2[i - 1] >= mod ? A.f2[i] + A.f2[i - 1] - mod
                                                   : A.f2[i] + A.f2[i - 1]) +
                         A.f1[i - 1]);
  for (int i = 0; i < m; ++i) {
    long long tmp = A.f0[i];
    A.f0[i] = A.f1[i];
    A.f1[i] = A.f2[i];
    A.f2[i] = tmp;
  }
}
inline void work(int n) {
  ans.f2[1] = 3;
  ans.f0[0] = ans.f1[0] = ans.f1[1] = ans.f2[0] = ans.f2[2] = 1;
  if (m <= 2) ans.f2[2] = 0;
  int ws = 30;
  while (!((n >> ws) & 1)) --ws;
  for (int i = ws - 1; i >= 0; --i) {
    if ((n >> i) & 1) add(ans);
    if (i) dbl(ans);
  }
}
int main() {
  read(n);
  read(m);
  if (n == 1) return 0 * puts("1");
  ++m;
  lim = 1;
  while (lim < (m << 1)) lim <<= 1;
  work(n);
  for (int i = 1; i < m; ++i) printf("%lld ", ans.f2[i]);
  putchar('\n');
  return 0;
}
