#include <bits/stdc++.h>   const int G = 3;   const int K = 40001;   const int inv2 = 499122177;   const int MaxN = 6e5 + 10;   const int mod = 998244353;   int n, k, lim, w[MaxN], rev[MaxN], _inv[MaxN];   void Mod(int &x) { x += x >> 31 & mod; }   void __init() {     _inv[1] = 1;     for (int i = 2; i < MaxN; i++)       _inv[i] = (unsigned long long)(mod - mod / i) * _inv[mod % i] % mod;   }   int fast_pow(int a, int b) {     int ret = 1;     while (b) {       if (b & 1) ret = (unsigned long long)ret * a % mod;       a = (unsigned long long)a * a % mod, b >>= 1;     }     return ret;   }   void init(int n) {     int l = 32 - __builtin_clz(n - 1);     lim = (1 << l);     for (int i = 0, ri = 0; i < lim; i++) {       rev[i] = ri;       for (int k = lim >> 1; (ri ^= k) < k;) k >>= 1;     }     int wn = fast_pow(G, (mod - 1) >> l);     w[lim >> 1] = 1;     for (int i = (lim >> 1) + 1; i < lim; i++)       w[i] = (unsigned long long)w[i - 1] * wn % mod;     for (int i = (lim >> 1) - 1; i; --i) w[i] = w[i << 1];     lim = l;   }   struct poly {     std::vector<int> v;     inline poly() {}     inline poly(int n) : v(n) {}     inline poly(const poly &r) : v(r.v) {}     inline poly(const std::vector<int> &r) : v(r) {}     inline size_t size() { return v.size(); }     inline bool empty() { return v.empty(); }     inline void resize(int n) { v.resize(n); }     inline void clear() { v.clear(); }     inline void shl() { v.insert(v.begin(), 0); }     void shrink() {       while (!v.empty() && !v.back()) v.pop_back();     }     inline int &operator[](int i) { return v[i]; }     inline static int len(int n) { return 1 << (32 - __builtin_clz(n - 1)); }     void deriv() {       for (int i = 1; i < v.size(); i++)         v[i - 1] = (unsigned long long)i * v[i] % mod;       v.pop_back();     }     void intg() {       shl();       for (int i = 1; i < v.size(); i++)         v[i] = (unsigned long long)v[i] * _inv[i] % mod;     }     void dft(int n) {       static unsigned long long tmp[MaxN];       int ofs = lim - __builtin_ctz(n);       resize(n);       if (n <= 1) return;       for (int i = 0; i < n; i++) tmp[rev[i] >> ofs] = v[i];       for (int i = 0; i < n; i += 2) {         int x = tmp[i], y = tmp[i + 1];         tmp[i] = x + y, tmp[i + 1] = x + mod - y;       }       for (int i = 2; i < n; i <<= 1)         for (int j = 0; j < n; j += (i << 1))           for (int k = 0; k < i; ++k) {             int y = (unsigned long long)tmp[i + j + k] * w[i + k] % mod;             tmp[i + j + k] = tmp[j + k] + mod - y, tmp[j + k] += y;           }       for (int i = 0; i < n; i++) v[i] = tmp[i] % mod;     }     void idft(int n) {       dft(n);       if (n <= 1) return;       std::reverse(v.begin() + 1, v.end());       int tmp = mod - (mod - 1) / n;       for (int i = 0; i < n; i++) v[i] = (unsigned long long)v[i] * tmp % mod;     }     void mul(int k) {       int n = size();       for (int i = 0; i < n; i++)         v[i] = (unsigned long long)(v[i] * k % mod + mod) % mod;     }     void add(poly r) {       int n = std::max(size(), r.size());       resize(n);       for (int i = 0; i < n; i++) v[i] = (unsigned long long)(v[i] + r[i]) % mod;       shrink();     }     void mul(poly r) {       int n = len(size() + r.size() - 1);       dft(n), r.dft(n);       for (int i = 0; i < n; i++) v[i] = (unsigned long long)v[i] * r[i] % mod;       idft(n), shrink();     }     void inv() {       std::vector<int> va(1);       int n = size(), m = len(n);       va[0] = fast_pow(v[0], mod - 2);       poly a;       v.resize(m), v.swap(va);       for (int i = 1; i <= m; i <<= 1) {         a.resize(i);         for (int j = 0; j < i; j++) a[j] = va[j];         a.dft(i << 1), dft(i << 1);         for (int j = 0; j < (i << 1); j++)           v[j] = v[j] * (2 + mod - (unsigned long long)v[j] * a[j] % mod) % mod;         idft(i << 1), resize(i);       }       resize(n);     }     void ln() {       poly f0 = *this;       int n = size();       deriv(), f0.inv(), mul(f0);       resize(n), intg(), resize(n);     }     void exp() {       std::vector<int> va(1);       va[0] = 1;       poly a;       int n = size(), m = len(n);       v.resize(m), v.swap(va);       for (int i = 1; i <= m; i *= 2) {         a = *this, a.resize(i), a.ln();         for (int j = 0; j < i; j++) a[j] = (va[j] + !j + mod - a[j]) % mod;         mul(a), resize(i);       }       resize(n);     }     void pw(int k) {       ln();       int n = size();       for (int i = 0; i < n; i++) v[i] = (unsigned long long)v[i] * k % mod;       exp();     }     void sqrt() {       std::vector<int> va(1);       int n = size(), m = len(n);       poly a, b;       va[0] = ::sqrt(v[0]);       v.resize(m), v.swap(va);       for (int i = 1; i <= m; i <<= 1) {         a.resize(i), b.resize(i);         for (int j = 0; j < i; j++) a[j] = va[j], b[j] = v[j];         b.inv(), a.mul(b);         for (int j = 0; j < i; j++)           v[j] = (unsigned long long)(v[j] + a[j]) % mod * inv2 % mod;         resize(i << 1);       }       resize(n);     }   } a, b, c, f, g, h;   void extend() {     f = g, g = h, h[0] = g[0];     f.resize(K), g.resize(K), h.resize(K);     for (int i = 1; i < K; i++)       h[i] = (((f[i - 1]) + ((((g[i - 1]) + (g[i])) % mod))) % mod);   }   void Double() {     int len = poly::len(2 * K), A, B, C, w = 1, wn = fast_pow(3, (mod - 1) / len);     a = f, a.dft(len), b = g, b.dft(len), c = h, c.dft(len);     for (int i = 0; i < len; i++, w = (unsigned long long)w * wn % mod) {       A = a[i], B = b[i], C = c[i];       a[i] =           (unsigned long long)(1ll * B * B % mod + 1ll * A * A % mod * w % mod) %           mod;       b[i] =           (unsigned long long)(1ll * B * C % mod + 1ll * A * B % mod * w % mod) %           mod;       c[i] =           (unsigned long long)(1ll * C * C % mod + 1ll * B * B % mod * w % mod) %           mod;     }     a.idft(len), f = a, b.idft(len), g = b, c.idft(len), h = c;     f.resize(K), g.resize(K), h.resize(K);   }   inline int read() {     unsigned long long x = 0;     char ch = getchar();     while (ch >  9  || ch <  0 ) ch = getchar();     while (ch <=  9  && ch >=  0 ) x = ((x * 10) + (ch ^ 48)), ch = getchar();     return x;   }   signed main() {     __init(), init(300000), n = read(), k = read(), f.resize(K);     g.resize(K), h.resize(K), g[0] = 1, h[0] = 1, h[1] = 1;     int lg = log2(n);     for (int i = lg - 1; ~i; i--) {       Double();       if (n & (1 << i)) extend();     }     for (int i = 1; i <= k; i++) printf( %d  , h[i]);     return 0;   }