#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using db = double;
const int N = 1 << 15;
using arr = array<int, N * 2>;
const int mod = 998244353;
const int P = mod;
const int G = 3;
unordered_map<int, arr> f;
int mr(int x) { return x >= mod ? x - mod : x; }
ll POW(ll a, ll n) {
  ll re = 1 % P;
  while (n) {
    if (n & 1) (re *= a) %= P;
    if (n >>= 1) (a *= a) %= P;
  }
  return re;
}
ll INV(ll x) { return POW(x, P - 2); }
void ntt(arr &a, int op = 1) {
  int n = a.size();
  for (int i = 1, j = 0; i < n - 1; ++i) {
    for (int s = n; j ^= s >>= 1, ~j & s;) {
    }
    if (i < j) swap(a[i], a[j]);
  }
  for (int i = 1; i < n; i *= 2) {
    ll u = POW(G, (P - 1) / (i * 2));
    if (op == -1) u = INV(u);
    for (int j = 0; j < n; j += i * 2) {
      ll w = 1;
      for (int k = 0; k < i; ++k, w = w * u % P) {
        int x = a[j + k], y = w * a[j + k + i] % P;
        a[j + k] = x + y;
        ({
          if ((a[j + k]) >= P) (a[j + k]) -= P;
        });
        a[j + k + i] = x - y + P;
        ({
          if ((a[j + k + i]) >= P) (a[j + k + i]) -= P;
        });
      }
    }
  }
  if (op == -1) {
    ll inv = INV(n);
    for (int i = 0; i < n; ++i) a[i] = a[i] * inv % P;
  }
}
arr multi(arr a, arr b) {
  int n = N * 2;
  ntt(a);
  ntt(b);
  for (int i = 0; i < n; ++i) a[i] = (ll)a[i] * b[i] % P;
  ntt(a, -1);
  fill(a.begin() + N, a.begin() + N * 2, 0);
  return a;
}
void add(arr &a, const arr &b) {
  for (int i = 0; i < N; ++i) a[i] = mr(a[i] + b[i]);
}
arr shl(arr a) {
  for (int i = N - 1; i >= 1; --i) a[i] = a[i - 1];
  a[0] = 0;
  return a;
}
void get(int x) {
  if (f.count(x)) return;
  if (f.count(x - 1) && f.count(x - 2)) {
    for (int i = 0; i < N; ++i)
      f[x][i] =
          mr(f[x - 1][i] + (i ? mr(f[x - 1][i - 1] + f[x - 2][i - 1]) : 0));
  } else if (x % 2 == 0) {
    assert(f.count(x / 2) && f.count(x / 2 - 1));
    arr a = multi(f[x / 2], f[x / 2]);
    add(f[x], a);
    arr b = multi(f[x / 2 - 1], f[x / 2 - 1]);
    add(f[x], shl(b));
  } else {
    assert(f.count(x / 2 + 1) && f.count(x / 2) && f.count(x / 2 - 1));
    arr a = multi(f[x / 2], f[x / 2 + 1]);
    add(f[x], a);
    arr b = multi(f[x / 2 - 1], f[x / 2]);
    add(f[x], shl(b));
  }
}
void cal(int x) {
  if (x == 1) {
    f[0][0] = 1;
    f[1][0] = 1;
    f[1][1] = 1;
    return;
  }
  if (x % 2 == 1) {
    cal(x / 2);
    get(x / 2 + 1);
    get(x - 1);
    get(x);
  } else {
    cal(x - 1);
    get(x);
  }
}
int main() {
  int n, k;
  cin >> n >> k;
  cal(n);
  for (int i = 1; i <= k; ++i) printf("%d ", f[n][i]);
  puts("");
  return 0;
}
