#include <bits/stdc++.h>
using namespace std;
int Read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  return x;
}
void Write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x == 0) putchar('0');
  int stk[55], tp = 0;
  while (x) stk[++tp] = x % 10, x /= 10;
  for (int i = tp; i; i--) putchar(stk[i] + '0');
}
int Add(int a, int b) {
  return (a + b >= 998244353) ? a + b - 998244353 : a + b;
}
int Dec(int a, int b) { return (a - b < 0) ? a - b + 998244353 : a - b; }
int mul(int a, int b) { return 1ll * a * b % 998244353; }
unsigned int qpow(unsigned int a, int b) {
  unsigned int res = 1;
  for (; b; b >>= 1, a = mul(a, a))
    if (b & 1) res = mul(res, a);
  return res;
}
namespace NTT {
int sz;
unsigned int w[2500005], w_mf[2500005];
int mf(int x) { return (1ll * x << 32) / 998244353; }
void init(int n) {
  for (sz = 2; sz < n; sz <<= 1)
    ;
  unsigned int pr = qpow(3, (998244353 - 1) / sz);
  w[sz / 2] = 1;
  w_mf[sz / 2] = mf(1);
  for (int i = 1; i <= sz / 2; i++)
    w[sz / 2 + i] = mul(w[sz / 2 + i - 1], pr),
               w_mf[sz / 2 + i] = mf(w[sz / 2 + i]);
  for (int i = sz / 2 - 1; i; i--) w[i] = w[i << 1], w_mf[i] = w_mf[i << 1];
}
void ntt(vector<unsigned int>& A, int L) {
  for (int d = L >> 1; d; d >>= 1)
    for (int i = 0; i < L; i += (d << 1))
      for (int j = 0; j < d; j++) {
        unsigned int x = A[i + j] + A[i + d + j];
        if (x >= 998244353 * 2) x -= 998244353 * 2;
        long long t = A[i + j] + 998244353 * 2 - A[i + d + j],
                  q = t * w_mf[d + j] >> 32, y = t * w[d + j] - q * 998244353;
        A[i + j] = x;
        A[i + d + j] = y;
      }
  for (int i = 0; i < L; i++)
    if (A[i] >= 998244353) A[i] -= 998244353;
}
void intt(vector<unsigned int>& A, int L) {
  for (int d = 1; d < L; d <<= 1)
    for (int i = 0; i < L; i += (d << 1))
      for (int j = 0; j < d; j++) {
        unsigned int x = A[i + j];
        if (x >= 998244353 * 2) x -= 998244353 * 2;
        long long t = A[i + d + j], q = t * w_mf[d + j] >> 32,
                  y = t * w[d + j] - q * 998244353;
        A[i + j] = x + y, A[i + d + j] = x + 2 * 998244353 - y;
      }
  int k = __builtin_ctz(L);
  reverse(A.begin() + 1, A.end());
  for (int i = 0; i < L; i++) {
    long long m = -A[i] & (L - 1);
    A[i] = (A[i] + m * 998244353) >> k;
    if (A[i] >= 998244353) A[i] -= 998244353;
  }
}
}  // namespace NTT
struct poly {
  vector<unsigned int> a;
  poly(int d = 0, int t = 0) {
    a.resize(d + 1);
    a[d] = t;
  }
  int deg() { return a.size() - 1; }
  unsigned int& operator[](const int& b) { return a[b]; }
  poly extend(int x) {
    poly c = *this;
    c.a.resize(x + 1);
    return c;
  }
  void resize(int x) { a.resize(x); }
  int size() { return a.size(); }
  void Get(int n) {
    a.resize(n + 1);
    for (int i = 0; i <= n; i++) a[i] = Read();
  }
  void Print(int n) {
    for (int i = 0; i <= n; i++) Write(a[i]), putchar(' ');
    puts("");
  }
  friend poly operator*(poly A, poly B) {
    int n = A.deg() + B.deg() + 1, lim = 2;
    for (; lim < n; lim <<= 1)
      ;
    NTT::init(lim);
    A.resize(lim);
    B.resize(lim);
    NTT::ntt(A.a, lim);
    NTT::ntt(B.a, lim);
    for (int i = 0; i < lim; i++) A[i] = mul(A[i], B[i]);
    NTT::intt(A.a, lim);
    return A.extend(n - 1);
  }
  poly inv(poly A) {
    int n = A.a.size(), lim = 2;
    if (n == 1) return A[0] = qpow(A[0], 998244353 - 2), A;
    poly B = A;
    B.resize((n + 1) >> 1);
    B = inv(B);
    for (; lim < (n << 1); lim <<= 1)
      ;
    NTT::init(lim);
    A.resize(lim), B.resize(lim), NTT::ntt(A.a, lim);
    NTT::ntt(B.a, lim);
    for (int i = 0; i < lim; i++) A[i] = mul(Dec(2, mul(A[i], B[i])), B[i]);
    NTT::intt(A.a, lim);
    return A.extend(n - 1);
  }
  poly getinv() { return inv(*this); }
  poly getdao() {
    poly A = *this, B;
    int n = A.a.size();
    B.resize(n);
    for (int i = 1; i < n; i++) B[i - 1] = mul(A[i], i);
    B[n - 1] = 0;
    return B;
  }
  poly getjf() {
    poly A = *this, B;
    int n = A.a.size();
    B.resize(n);
    for (int i = 1; i < n; i++) B[i] = mul(A[i - 1], qpow(i, 998244353 - 2));
    B[0] = 0;
    return B;
  }
  poly getln() {
    poly A = *this;
    return (A.getdao() * A.getinv()).extend(A.deg()).getjf();
  }
  poly exp(poly A) {
    int n = A.a.size();
    if (n == 1) return A[0] = 1, A;
    poly B = A;
    B.resize((n + 1) >> 1);
    B = exp(B);
    poly C = B.getln();
    C.resize(n);
    for (int i = 0; i < n; i++) C[i] = Dec(A[i], C[i]);
    ++C[0];
    return (B * C).extend(n - 1);
  }
  poly getexp() { return exp(*this); }
  poly getmi(int k) {
    poly A = *this;
    int n = A.a.size();
    poly B = A.getln();
    for (int i = 0; i < n; i++) B[i] = mul(B[i], k);
    return B.getexp();
  }
  poly sqrt(poly A) {
    int n = A.size(), lim = 2;
    if (n == 1) return A[0] = 1, A;
    poly B = A;
    B.resize((n + 1) >> 1);
    B = sqrt(B);
    poly C = A.extend(n - 1), D = B.getinv();
    for (; lim < (n << 1); lim <<= 1)
      ;
    NTT::init(lim);
    B.resize(lim), C.resize(lim), D.resize(lim), NTT::ntt(B.a, lim);
    NTT::ntt(C.a, lim);
    NTT::ntt(D.a, lim);
    for (int i = 0; i < lim; i++)
      B[i] = mul(Add(B[i], mul(C[i], D[i])), 499122177);
    NTT::intt(B.a, lim);
    return B.extend(n - 1);
  }
  poly getsqrt() { return sqrt(*this); }
};
signed main() {
  int n = Read(), k = Read();
  poly A, B;
  A.resize(k * 3), B.resize(k * 3);
  A[0] = 1;
  A[1] = 6;
  A[2] = 1;
  A = A.getsqrt();
  B = A.getinv();
  ++A[1];
  ++A[0];
  for (int i = 0; i <= k; i++) A[i] = 1ll * A[i] * 499122177 % 998244353;
  A = A.getmi(n + 1);
  A = (A * B).extend(k * 3);
  for (int i = 1; i <= k; i++) {
    if (i <= n)
      printf("%d ", A[i]);
    else
      printf("%d ", 0);
  }
  return 0;
}
