#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
const int MAX = (1 << 20) + 1;
const int inv2 = 499122177;
int w[MAX];
int fpow(int b, int p) {
  int r = 1;
  while (p > 0) {
    if (p & 1) r = (1ll * r * b) % MOD;
    p >>= 1;
    b = (1ll * b * b) % MOD;
  }
  return r;
}
void NTT(vector<int> &x, int k, int dir) {
  w[0] = 1;
  int G = fpow(3, (MOD - 1) / k);
  for (int i = 1; i <= k; i++) w[i] = 1LL * w[i - 1] * G % MOD;
  for (int i = 0, j = 0; i < k; i++) {
    if (i > j) swap(x[i], x[j]);
    for (int l = k >> 1; (j ^= l) < l; l >>= 1)
      ;
  }
  for (int i = 2; i <= k; i <<= 1) {
    int mid = i >> 1;
    for (int j = 0; j < k; j += i) {
      for (int l = 0; l < mid; l++) {
        int t;
        if (dir == 1)
          t = 1LL * x[j + l + mid] * w[(k / i) * l] % MOD;
        else
          t = 1LL * x[j + l + mid] * w[k - (k / i) * l] % MOD;
        x[j + l + mid] = (x[j + l] - t + MOD) % MOD;
        x[j + l] += t;
        x[j + l] %= MOD;
      }
    }
  }
  if (dir == -1) {
    int r = fpow(k, MOD - 2);
    for (int i = 0; i < k; i++) x[i] = 1LL * x[i] * r % MOD;
  }
}
void mult(vector<int> &a, vector<int> b) {
  int sz = 2 * a.size();
  a.resize(sz);
  b.resize(sz);
  NTT(a, sz, 1);
  NTT(b, sz, 1);
  for (int i = 0; i < sz; ++i) a[i] = (1ll * a[i] * b[i]) % MOD;
  NTT(a, sz, -1);
  a.resize(sz / 2);
}
vector<int> fpowpoly(vector<int> &a, int p) {
  int sza = a.size();
  vector<int> r(sza);
  r[0] = 1;
  while (p > 0) {
    if (p & 1) mult(r, a);
    p >>= 1;
    mult(a, a);
  }
  return r;
}
vector<int> inversepoly(vector<int> &a) {
  vector<int> r(1, fpow(a[0], MOD - 2));
  while (true) {
    int rsz = r.size();
    rsz *= 2;
    vector<int> tmpf(rsz);
    r.resize(rsz);
    vector<int> rn = r;
    for (int i = 0; i < rsz; i++) tmpf[i] = a[i];
    mult(rn, rn);
    mult(rn, tmpf);
    for (int i = 0; i < rsz; i++) {
      r[i] = (r[i] + r[i]) % MOD;
      r[i] = (r[i] - rn[i] + MOD) % MOD;
    }
    if (r.size() >= a.size()) break;
  }
  return r;
}
vector<int> sqrtpoly(vector<int> &a) {
  vector<int> r(1, 1);
  while (true) {
    int rsz = 2 * r.size();
    vector<int> tmpf(rsz);
    r.resize(rsz);
    for (int i = 0; i < rsz; i++) tmpf[i] = a[i];
    vector<int> iv = inversepoly(r);
    mult(iv, tmpf);
    for (int i = 0; i < rsz; i++) {
      r[i] = (r[i] + iv[i]) % MOD;
      r[i] = 1ll * r[i] * inv2 % MOD;
    }
    if (r.size() >= a.size()) break;
  }
  return r;
}
int main() {
  int n, k;
  scanf("%d%d", &n, &k);
  int sz = 1;
  while (sz <= k) sz = sz * 2;
  vector<int> D = {1, 6, 1};
  D.resize(sz);
  vector<int> s = sqrtpoly(D);
  vector<int> r1 = s, r2 = s;
  r1.resize(sz), r2.resize(sz);
  for (int i = 0; i < sz; i++) r2[i] = (-r2[i] + MOD) % MOD;
  r1[1] = (r1[1] + 1) % MOD;
  r1[0] = (r1[0] + 1) % MOD;
  r2[1] = (r2[1] + 1) % MOD;
  r2[0] = (r2[0] + 1) % MOD;
  vector<int> tmp = {inv2};
  mult(r1, tmp);
  mult(r2, tmp);
  vector<int> nr2 = r2, dif = r2;
  nr2[0] = (-1 + nr2[0] + MOD) % MOD;
  nr2[1] = (-1 + nr2[1] + MOD) % MOD;
  for (int i = 0; i < sz; i++) dif[i] = (dif[i] - r1[i] + MOD) % MOD;
  vector<int> iv = inversepoly(dif);
  mult(nr2, iv);
  vector<int> nr1(sz, 0);
  for (int i = 0; i < sz; i++) {
    nr1[i] = (-nr2[i] + MOD) % MOD;
    if (i == 0) nr1[i] = (nr1[i] + 1) % MOD;
  }
  r1 = fpowpoly(r1, n);
  r2 = fpowpoly(r2, n);
  mult(nr2, r1);
  mult(nr1, r2);
  for (int i = 0; i < sz; i++) {
    nr1[i] = (nr2[i] + nr1[i]) % MOD;
    if (i > 0 && i <= k) cout << nr1[i] << ' ';
  }
  cout << '\n';
  return 0;
}
