#include <bits/stdc++.h>   using namespace std;   int Read() {     int x = 0;     char ch = getchar();     while (!isdigit(ch)) ch = getchar();     while (isdigit(ch)) x = (x << 3) + (x << 1) + ch -  0 , ch = getchar();     return x;   }   void Write(int x) {     if (x < 0) putchar( - ), x = -x;     if (x == 0) putchar( 0 );     int stk[55], tp = 0;     while (x) stk[++tp] = x % 10, x /= 10;     for (int i = tp; i; i--) putchar(stk[i] +  0 );   }   int Add(int a, int b) {     return (a + b >= 998244353) ? a + b - 998244353 : a + b;   }   int Dec(int a, int b) { return (a - b < 0) ? a - b + 998244353 : a - b; }   int mul(int a, int b) { return 1ll * a * b % 998244353; }   unsigned int qpow(unsigned int a, int b) {     unsigned int res = 1;     for (; b; b >>= 1, a = mul(a, a))       if (b & 1) res = mul(res, a);     return res;   }   namespace NTT {   int sz;   unsigned int w[2500005], w_mf[2500005];   int mf(int x) { return (1ll * x << 32) / 998244353; }   void init(int n) {     for (sz = 2; sz < n; sz <<= 1)       ;     unsigned int pr = qpow(3, (998244353 - 1) / sz);     w[sz / 2] = 1;     w_mf[sz / 2] = mf(1);     for (int i = 1; i <= sz / 2; i++)       w[sz / 2 + i] = mul(w[sz / 2 + i - 1], pr),                  w_mf[sz / 2 + i] = mf(w[sz / 2 + i]);     for (int i = sz / 2 - 1; i; i--) w[i] = w[i << 1], w_mf[i] = w_mf[i << 1];   }   void ntt(vector<unsigned int>& A, int L) {     for (int d = L >> 1; d; d >>= 1)       for (int i = 0; i < L; i += (d << 1))         for (int j = 0; j < d; j++) {           unsigned int x = A[i + j] + A[i + d + j];           if (x >= 998244353 * 2) x -= 998244353 * 2;           long long t = A[i + j] + 998244353 * 2 - A[i + d + j],                     q = t * w_mf[d + j] >> 32, y = t * w[d + j] - q * 998244353;           A[i + j] = x;           A[i + d + j] = y;         }     for (int i = 0; i < L; i++)       if (A[i] >= 998244353) A[i] -= 998244353;   }   void intt(vector<unsigned int>& A, int L) {     for (int d = 1; d < L; d <<= 1)       for (int i = 0; i < L; i += (d << 1))         for (int j = 0; j < d; j++) {           unsigned int x = A[i + j];           if (x >= 998244353 * 2) x -= 998244353 * 2;           long long t = A[i + d + j], q = t * w_mf[d + j] >> 32,                     y = t * w[d + j] - q * 998244353;           A[i + j] = x + y, A[i + d + j] = x + 2 * 998244353 - y;         }     int k = __builtin_ctz(L);     reverse(A.begin() + 1, A.end());     for (int i = 0; i < L; i++) {       long long m = -A[i] & (L - 1);       A[i] = (A[i] + m * 998244353) >> k;       if (A[i] >= 998244353) A[i] -= 998244353;     }   }   }  // namespace NTT   struct poly {     vector<unsigned int> a;     poly(int d = 0, int t = 0) {       a.resize(d + 1);       a[d] = t;     }     int deg() { return a.size() - 1; }     unsigned int& operator[](const int& b) { return a[b]; }     poly extend(int x) {       poly c = *this;       c.a.resize(x + 1);       return c;     }     void resize(int x) { a.resize(x); }     int size() { return a.size(); }     void Get(int n) {       a.resize(n + 1);       for (int i = 0; i <= n; i++) a[i] = Read();     }     void Print(int n) {       for (int i = 0; i <= n; i++) Write(a[i]), putchar(   );       puts(  );     }     friend poly operator*(poly A, poly B) {       int n = A.deg() + B.deg() + 1, lim = 2;       for (; lim < n; lim <<= 1)         ;       NTT::init(lim);       A.resize(lim);       B.resize(lim);       NTT::ntt(A.a, lim);       NTT::ntt(B.a, lim);       for (int i = 0; i < lim; i++) A[i] = mul(A[i], B[i]);       NTT::intt(A.a, lim);       return A.extend(n - 1);     }     poly inv(poly A) {       int n = A.a.size(), lim = 2;       if (n == 1) return A[0] = qpow(A[0], 998244353 - 2), A;       poly B = A;       B.resize((n + 1) >> 1);       B = inv(B);       for (; lim < (n << 1); lim <<= 1)         ;       NTT::init(lim);       A.resize(lim), B.resize(lim), NTT::ntt(A.a, lim);       NTT::ntt(B.a, lim);       for (int i = 0; i < lim; i++) A[i] = mul(Dec(2, mul(A[i], B[i])), B[i]);       NTT::intt(A.a, lim);       return A.extend(n - 1);     }     poly getinv() { return inv(*this); }     poly getdao() {       poly A = *this, B;       int n = A.a.size();       B.resize(n);       for (int i = 1; i < n; i++) B[i - 1] = mul(A[i], i);       B[n - 1] = 0;       return B;     }     poly getjf() {       poly A = *this, B;       int n = A.a.size();       B.resize(n);       for (int i = 1; i < n; i++) B[i] = mul(A[i - 1], qpow(i, 998244353 - 2));       B[0] = 0;       return B;     }     poly getln() {       poly A = *this;       return (A.getdao() * A.getinv()).extend(A.deg()).getjf();     }     poly exp(poly A) {       int n = A.a.size();       if (n == 1) return A[0] = 1, A;       poly B = A;       B.resize((n + 1) >> 1);       B = exp(B);       poly C = B.getln();       C.resize(n);       for (int i = 0; i < n; i++) C[i] = Dec(A[i], C[i]);       ++C[0];       return (B * C).extend(n - 1);     }     poly getexp() { return exp(*this); }     poly getmi(int k) {       poly A = *this;       int n = A.a.size();       poly B = A.getln();       for (int i = 0; i < n; i++) B[i] = mul(B[i], k);       return B.getexp();     }     poly sqrt(poly A) {       int n = A.size(), lim = 2;       if (n == 1) return A[0] = 1, A;       poly B = A;       B.resize((n + 1) >> 1);       B = sqrt(B);       poly C = A.extend(n - 1), D = B.getinv();       for (; lim < (n << 1); lim <<= 1)         ;       NTT::init(lim);       B.resize(lim), C.resize(lim), D.resize(lim), NTT::ntt(B.a, lim);       NTT::ntt(C.a, lim);       NTT::ntt(D.a, lim);       for (int i = 0; i < lim; i++)         B[i] = mul(Add(B[i], mul(C[i], D[i])), 499122177);       NTT::intt(B.a, lim);       return B.extend(n - 1);     }     poly getsqrt() { return sqrt(*this); }   };   signed main() {     int n = Read(), k = Read();     poly A, B;     A.resize(k * 3), B.resize(k * 3);     A[0] = 1;     A[1] = 6;     A[2] = 1;     A = A.getsqrt();     B = A.getinv();     ++A[1];     ++A[0];     for (int i = 0; i <= k; i++) A[i] = 1ll * A[i] * 499122177 % 998244353;     A = A.getmi(n + 1);     A = (A * B).extend(k * 3);     for (int i = 1; i <= k; i++) {       if (i <= n)         printf( %d  , A[i]);       else         printf( %d  , 0);     }     return 0;   }