#include <bits/stdc++.h>

using namespace std;

#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define fst first
#define snd second
#define SZ(u) ((int) (u).size())
#define ALL(u) (u).begin(), (u).end()

inline void proc_status()
{
    ifstream t("/proc/self/status");
    cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}

template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
template<typename T> inline T read()
{
	register T sum = 0, fg = 1;
	register char ch(getchar());
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') fg = -1;
	for(;  isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) - '0' + ch;
	return sum * fg;
}

typedef long long LL;
typedef pair<int, int> pii;

const int MOD = 998244353;
const int MAXN = (int) 2e3;

int n, K;

inline void input()
{
	K = read<int>(), n = read<int>();
}

int fac[MAXN + 5], ifac[MAXN + 5];

inline int fpm(int x, int y)
{
	int res = 1;
	for(; y; y >>= 1, x = (LL) x * x % MOD) if(y & 1) res = (LL) res * x % MOD;
	return res;
}

inline void MATH_init()
{
	fac[0] = 1;
	for(int i = 1; i <= MAXN; ++i) fac[i] = (LL) fac[i - 1] * i % MOD;
	ifac[MAXN] = fpm(fac[MAXN], MOD - 2);
	for(int i = MAXN - 1; ~i; --i) ifac[i] = (LL) ifac[i + 1] * (i + 1) % MOD;
}

inline int C(int n0, int m0) { return n0 < m0 ? 0 : (LL) fac[n0] * ifac[n0 - m0] % MOD * ifac[m0] % MOD; }

namespace NTT
{
	const int MAX_LEN = MAXN * 2;

	int len, dis, rev[MAX_LEN + 5], g[MAX_LEN + 5], inv_len;

	inline void init(int len0)
	{
		for(len = 1, dis = 0; len <= len0; len <<= 1) ++dis;
		for(int i = 0; i < len; ++i) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (dis - 1));
		int G = fpm(3, (MOD - 1) / len);
		g[0] = 1;
		for(int i = 1; i <= len; ++i) g[i] = (LL) g[i - 1] * G % MOD;
		inv_len = fpm(len, MOD - 2);
	}

	inline void FFT(int x[], int type)
	{
		for(int i = 0; i < len; ++i) if(i < rev[i]) swap(x[i], x[rev[i]]);
		for(int k = 2; k <= len; k <<= 1)
			for(int j = 0; j < len; j += k)
				for(int i = 0; i < k / 2; ++i)
				{
					int G = type ? g[len / k * i] : g[len - len / k * i];
					int X = x[i + j], Y = (LL) x[i + j + k / 2] * G % MOD;
					x[i + j] = (X + Y) % MOD;
					x[i + j + k / 2] = (X - Y) % MOD;
				}
		if(!type) for(int i = 0; i < len; ++i) x[i] = (LL) x[i] * inv_len % MOD;
	}

	inline void mul(int *a, int N, int *b, int M, int *c)
	{
		static int F[MAX_LEN + 5], G[MAX_LEN + 5], H[MAX_LEN + 5];

		init(N + M);
		for(int i = 0; i < len; ++i) F[i] = i <= N ? a[i] : 0;
		for(int i = 0; i < len; ++i) G[i] = i <= M ? b[i] : 0;
		FFT(F, 1), FFT(G, 1);
		for(int i = 0; i < len; ++i) H[i] = (LL) F[i] * G[i] % MOD;
		FFT(H, 0);
		for(int i = 0; i <= N + M; ++i) c[i] = H[i];
	}
}

inline int calc(int N, int p, int q)
{
	static int f[MAXN + 5], g[MAXN + 5], h[MAXN + 5];
	memset(f, 0, sizeof f);
	memset(g, 0, sizeof g);
	memset(h, 0, sizeof h);

	for(int i = 0; i <= p; ++i) f[i] = (LL) C(p, i) * fpm(2, i) % MOD;
	for(int i = 0; i <= q; ++i) g[i] = C(q, i);
	NTT::mul(f, p, g, q, h);

	int ans = 0;
	for(int i = 1; i <= p + q; ++i) (ans += (LL) C(N - 1, i - 1) * h[i] % MOD) %= MOD;
	return (ans + MOD) % MOD;
}

inline void solve()
{
	MATH_init();

	for(int k = 2; k <= 2 * K; ++k)
		if(k % 2 == 1)
		{
			int p = 0, q = 0;
			for(int i = 1; i <= K; ++i) if(k - i >= 1 && k - i <= K) ++p; else ++q;
			printf("%d\n", calc(n, p / 2, q));
		}
		else
		{
			int p = 0, q = 0;
			for(int i = 1; i <= K; ++i) if(k - i >= 1 && k - i <= K) ++p; else ++q;
			printf("%d\n", (calc(n, (p - 1) / 2, q) + calc(n - 1, (p - 1) / 2, q)) % MOD);
		}
}

int main()
{
	input();
	solve();

	return 0;
}



Measured memory_bytes: 384