#include <bits/stdc++.h>
using namespace std;
template <class T, class S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
  return os << "(" << v.first << ", " << v.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "[";
  for (int i = int(0); i <= int((static_cast<int>((v).size())) - 1); ++i) {
    if (i) os << ", ";
    os << v[i];
  }
  return os << "]";
}
template <class T>
bool setmax(T& _a, T _b) {
  if (_a < _b) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
bool setmin(T& _a, T _b) {
  if (_b < _a) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
T gcd(T _a, T _b) {
  return _b == 0 ? _a : gcd(_b, _a % _b);
}
long long powmod(long long a, long long b, long long m) {
  long long r = 1;
  for (; b > 0; b >>= 1, a = a * a % m) {
    if (b & 1) r = r * a % m;
  }
  return r;
}
const int MOD = 998244353;
const int GN = MOD - 1;
const int G = 3;
void fft(int* a, int n, bool is_inv) {
  static vector<int> b;
  if (static_cast<int>((b).size()) < n) b.resize(n);
  for (int t = n / 2; t >= 1; t /= 2) {
    long long w = powmod(G, GN / n * t, MOD), p = 1;
    if (is_inv) w = powmod(w, MOD - 2, MOD);
    for (int j = 0; j < n / 2; j += t, (p *= w) %= MOD)
      for (int i = 0; i < t; ++i) {
        long long u = a[i + j * 2];
        long long v = p * a[i + t + j * 2] % MOD;
        b[i + j] = int(u + v) % MOD;
        b[i + j + n / 2] = int(u + MOD - v) % MOD;
      }
    memcpy(a, &b[0], sizeof(int) * n);
  }
  if (is_inv) {
    long long inv = powmod(n, MOD - 2, MOD);
    for (int i = int(0); i <= int((n)-1); ++i) a[i] = int(a[i] * inv % MOD);
  }
}
struct Poly {
  vector<int> a;
  Poly operator*(const Poly& b) const {
    assert(static_cast<int>((a).size()) == static_cast<int>((b.a).size()));
    Poly r;
    r.a.resize(static_cast<int>((a).size()));
    for (int i = int(0); i <= int((static_cast<int>((a).size())) - 1); ++i)
      r.a[i] = ((long long)a[i] * b.a[i]) % MOD;
    return r;
  }
  void operator+=(const Poly& b) {
    if (static_cast<int>((a).size()) < static_cast<int>((b.a).size()))
      a.resize(static_cast<int>((b.a).size()));
    for (int i = int(0); i <= int((static_cast<int>((b.a).size())) - 1); ++i)
      (a[i] += b.a[i]) %= MOD;
  }
};
struct Mat {
  Poly a[2][2];
  Mat operator*(const Mat& b) const {
    Mat r;
    for (int i = int(0); i <= int((2) - 1); ++i)
      for (int j = int(0); j <= int((2) - 1); ++j)
        for (int k = int(0); k <= int((2) - 1); ++k) {
          r.a[i][j] += a[i][k] * b.a[k][j];
        }
    r.transform(true);
    for (int i = int(0); i <= int((2) - 1); ++i)
      for (int j = int(0); j <= int((2) - 1); ++j) {
        fill(r.a[i][j].a.begin() + static_cast<int>((r.a[i][j].a).size()) / 2,
             r.a[i][j].a.end(), 0);
      }
    r.transform(false);
    return r;
  }
  void transform(bool is_inv) {
    for (int i = int(0); i <= int((2) - 1); ++i)
      for (int j = int(0); j <= int((2) - 1); ++j)
        fft(&a[i][j].a[0], static_cast<int>((a[i][j].a).size()), is_inv);
  }
};
int main() {
  int n, k;
  cin >> n >> k;
  int len = 2;
  while (len < k * 2) len *= 2;
  Mat m;
  for (int i = int(0); i <= int((2) - 1); ++i)
    for (int j = int(0); j <= int((2) - 1); ++j) m.a[i][j].a.resize(len);
  m.a[0][0].a[0] = m.a[0][0].a[1] = 1;
  m.a[0][1].a[1] = 1;
  m.a[1][0].a[0] = 1;
  Mat r;
  for (int i = int(0); i <= int((2) - 1); ++i)
    for (int j = int(0); j <= int((2) - 1); ++j) r.a[i][j].a.resize(len);
  r.a[0][0].a[0] = 1;
  r.a[1][1].a[0] = 1;
  m.transform(false);
  r.transform(false);
  for (; n > 0; n >>= 1, m = m * m) {
    if (n & 1) r = r * m;
  }
  r.transform(true);
  for (int i = int(1); i <= int(k); ++i) {
    long long cur = 0;
    cur += r.a[1][0].a[i] + r.a[1][0].a[i - 1];
    cur += r.a[1][1].a[i];
    printf("%d ", int(cur % MOD));
  }
  printf("\n");
  return 0;
}
