#include <bits/stdc++.h>
using namespace std;
#define db(x) cerr << #x << "=" << x << endl
#define db2(x, y) cerr << #x << "=" << x << "," << #y << "=" << y << endl
#define db3(x, y, z) cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z << endl
#define dbv(v) cerr << #v << "="; for (auto _x : v) cerr << _x << ", "; cerr << endl
#define dba(a, n) cerr << #a << "="; for (int _i = 0; _i < (n); ++_i) cerr << a[_i] << ", "; cerr << endl
typedef long long ll;
typedef long double ld;
const ll MOD = 998244353;
ll F[2005][2005], binom[4005][2005];
const int MAXN = 4096;
// NTT-iterative with cache locality: fast
namespace fft {
	const int mod = 998244353; // 2^23 * 119 + 1
	const int gen = 3; // ord(3) = 2^23 * 119
	int rootpw[MAXN], AV[MAXN], BV[MAXN], rev[MAXN];
	int current = -1;
	int modex(int a, int p) {
		if (!p) return 1;
		if (p & 1) return (ll)a * modex(a, p - 1) % mod;
		ll v = modex(a, p >> 1);
		return v * v % mod;
	}
	void fft(int *a, int n) {
		if (n != current) {
			for (int i = 0; i < n; ++i) {
				int j = 0;
				int x = i, y = n - 1;
				while (y) {
					j = (j << 1) + (x & 1);
					x >>= 1;
					y >>= 1;
				}
				rev[i] = j;
			}
			for (int len = 1; len < n; len <<= 1) {
				int root = modex(gen, (mod - 1) / (2 * len));
				rootpw[len] = 1;
				for (int i = 1; i < len; ++i) rootpw[len + i] = (ll)rootpw[len + i - 1] * root % mod;
			}
			current = n;
		}
		for (int i = 0; i < n; ++i) {
			if (i < rev[i]) swap(a[i], a[rev[i]]);
		}
		for (int len = 1; len < n; len <<= 1)
			for (int i = 0; i < n; i += 2 * len)
				for (int j = 0; j < len; ++j) {
					int u = a[i + j], v = (ll)a[i + j + len] * rootpw[len + j] % mod;
					a[i + j] = u + v >= mod ? u + v - mod : u + v;
					a[i + j + len] = u - v < 0 ? u - v + mod : u - v;
				}
	}
	void multiply(int *A, int *B, int *C, int n) {
		for (int i = 0; i < n; ++i) {
			AV[i] = A[i];
			BV[i] = B[i];
		}
		fft(AV, n);
		int inv = modex(n, mod - 2);
		for (int i = 0; i < n; ++i) C[i] = (ll)AV[i] * BV[i] % mod;
		fft(C, n);
		reverse(C + 1, C + n);
		for (int i = 0; i < n; ++i) C[i] = (ll)C[i] * inv % mod;
	}
	void square(int *A, int *C, int n) {
		fft(A, n);
		int inv = modex(n, mod - 2);
		for (int i = 0; i < n; ++i) C[i] = (ll)A[i] * A[i] % mod;
		fft(C, n);
		reverse(C + 1, C + n);
		for (int i = 0; i < n; ++i) C[i] = (ll)C[i] * inv % mod;
	}
};
int V[MAXN], W[MAXN];
int main() {
	for (int i = 0; i < 4005; ++i)
		for (int j = 0; j <= min(i, 2004); ++j)
			if (!j || j == i) binom[i][j] = 1;
			else binom[i][j] = (binom[i - 1][j - 1] + binom[i - 1][j]) % MOD;
	int K, N;
	scanf("%d%d", &K, &N);
	V[0] = 1;
	for (int i = 1; i <= N; ++i) V[i] = 2;
	W[0] = 1;
	F[0][0] = 1;
	fft::fft(V, MAXN);
	for (int i = 1; i <= K / 2; ++i) {
		fft::multiply(W, V, W, MAXN);
		for (int x = 0; x <= N; ++x) {
			F[x][i] = W[x];
		}
		fill(W + N + 1, W + MAXN, 0);
	}
	for (int i = 2; i <= 2 * K; ++i) {
		ll ans = 0;
		int b = 0, a = 0, c = 0;
		for (int j = 1; j <= K; ++j) {
			if (i - j < 1 || i - j > K) ++b;
			else if (i - j != j) ++a;
			else ++c;
		}
		assert(a % 2 == 0);
		a /= 2;
		for (int x = 0; x <= N; ++x) {
			ll v = 0;
			if (b >= 1) v = binom[N - x + b - 1][b - 1];
			else if (N - x == 0 && !b) v = 1;
			ans = ans + F[x][a] * v;
			// w assumes c = 0
			if (x != N && c) {
				v = 0;
				if (b >= 1) v = binom[N - 1 - x + b - 1][b - 1];
				else if (N - 1 - x == 0 && !b) v = 1;
				ans = ans + F[x][a] * v;
			}
			ans %= MOD;
		}
		printf("%lld\n", ans);
	}
}


Measured memory_bytes: 93056