#include <bits/stdc++.h>
const int mod = 998244353;
inline int fpow(int x, int k) {
  int res = 1;
  for (; k; k >>= 1, x = 1ll * x * x % mod)
    if (k & 1) res = 1ll * res * x % mod;
  return res;
}
const int N = 1e5 + 5;
int n, k, lim, cnt, r[N], w[N];
inline void ntt_prepare(int len) {
  for (lim = 1, cnt = 0; lim <= len; lim <<= 1, ++cnt)
    ;
  for (int i = 0; i < lim; ++i)
    r[i] = (r[i >> 1] >> 1) | ((i & 1) << (cnt - 1));
}
void ntt(std::vector<int>& a, int op) {
  for (int i = 0; i < lim; ++i)
    if (i < r[i]) std::swap(a[i], a[r[i]]);
  for (int i = 1, wn; i < lim; i <<= 1) {
    wn = fpow(3,
              op == 1 ? (mod - 1) / (i << 1) : mod - 1 - (mod - 1) / (i << 1));
    w[0] = 1;
    for (int k = 1; k < i; ++k) w[k] = 1ll * w[k - 1] * wn % mod;
    for (int j = 0, len = i << 1; j < lim; j += len) {
      for (int k = 0; k < i; ++k) {
        int p = a[j + k], q = 1ll * w[k] * a[j + i + k] % mod;
        a[j + k] = (p + q) % mod;
        a[j + i + k] = (p + mod - q) % mod;
      }
    }
  }
  if (op == -1) {
    int inv_lim = fpow(lim, mod - 2);
    for (int i = 0; i < lim; ++i) a[i] = 1ll * a[i] * inv_lim % mod;
  }
}
inline std::vector<int> operator+(std::vector<int> a, std::vector<int> b) {
  for (int i = 0; i <= k; ++i) a[i] = (a[i] + b[i]) % mod;
  return a;
}
inline std::vector<int> operator*(std::vector<int> a, std::vector<int> b) {
  ntt_prepare(k + k + 1);
  a.resize(lim);
  ntt(a, 1);
  b.resize(lim);
  ntt(b, 1);
  for (int i = 0; i < lim; ++i) a[i] = 1ll * a[i] * b[i] % mod;
  ntt(a, -1);
  a.resize(k + 1);
  return a;
}
inline std::vector<int> T(std::vector<int> a) {
  for (int i = k; i; --i) a[i] = a[i - 1];
  a[0] = 0;
  return a;
}
inline void print(std::vector<int> a) {
  for (int i = 0; i <= k; ++i) printf("%d ", a[i]);
  printf("\n");
}
struct Node {
  std::vector<int> f[3];
};
Node solve(int x) {
  if (x == 1) {
    Node u;
    u.f[0].resize(k + 1);
    u.f[0][0] = 1;
    u.f[0][1] = 1;
    u.f[1].resize(k + 1);
    u.f[1][0] = 1;
    u.f[2].resize(k + 1);
    return u;
  }
  if (x == 2) {
    Node u;
    u.f[0].resize(k + 1);
    u.f[0][0] = 1;
    u.f[0][1] = 3;
    u.f[0][2] = 1;
    u.f[1].resize(k + 1);
    u.f[1][0] = 1;
    u.f[1][1] = 1;
    u.f[2].resize(k + 1);
    u.f[2][0] = 1;
    return u;
  }
  Node u, v = solve(x / 2);
  u.f[0] = v.f[0] * v.f[0] + T(v.f[1] * v.f[1]);
  u.f[1] = v.f[0] * v.f[1] + T(v.f[1] * v.f[2]);
  u.f[2] = v.f[1] * v.f[1] + T(v.f[2] * v.f[2]);
  if (x & 1) {
    std::vector<int> save_poly = u.f[1];
    u.f[2] = u.f[1];
    u.f[1] = u.f[0];
    u.f[0] = u.f[0] + T(u.f[0]) + T(save_poly);
  }
  return u;
}
int main() {
  scanf("%d%d", &n, &k);
  Node u = solve(n);
  for (int i = 1; i <= k; ++i) printf("%d ", u.f[0][i]);
  return 0;
}
