#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

#ifdef BTK
#define DEBUG if(1)
#else
#define CIN_ONLY if(1)
struct cww {cww() {CIN_ONLY{ios::sync_with_stdio(false); cin.tie(0);}}
}star;
#define DEBUG if(0)
#endif

#define ALL(v) (v).begin(),(v).end()
#define REC(ret, ...) std::function<ret (__VA_ARGS__)>
template <typename T>inline bool chmin(T &l, T r){bool a = l>r; if (a)l = r; return a;}
template <typename T>inline bool chmax(T &l, T r){bool a = l<r; if (a)l = r; return a;}
template <typename T>istream& operator>>(istream &is, vector<T> &v){for (auto &it : v)is >> it;return is;}

class range {private: struct I { int x; int operator*() { return x; }bool operator!=(I& lhs) { return x<lhs.x; }void operator++() { ++x; } }; I i, n;public:range(int n) :i({ 0 }), n({ n }) {}range(int i, int n) :i({ i }), n({ n }) {}I& begin() { return i; }I& end() { return n; }};
constexpr int mod = 998244353;
constexpr int sz = 3000;
LL dp[sz][sz][2];

inline LL invMod(LL a, LL m = mod) {
	LL b = m, u = 1, v = 0;
	while (b) {
		LL t = a / b;
		swap(a -= t * b, b);
		swap(u -= t * v, v);
	}
	return (u % m + m) % m;
}


// 階乗
// O(n)
constexpr int SZ = 1123456;
LL fact[SZ];
LL rfact[SZ];
struct fact_ {
	fact_() {
		fact[0] = 1;
		for (int i = 1; i<SZ; i++)
			fact[i] = fact[i - 1] * i%mod;
		rfact[SZ - 1] = invMod(fact[SZ - 1]);
		for (int i = SZ - 1; i>0; i--) {
			rfact[i - 1] = rfact[i] * i%mod;
		}
	}
}fact_init;


// 組み合わせnCk (mod mod)
// O(1)
LL Comb(LL n, LL k) {
	LL u = fact[n];
	LL d = (rfact[k] * rfact[n - k]) % mod;
	return u * d%mod;
}

int main() {
	for (int i : range(sz)) {
		dp[0][i][0] = 1;
	}
	for (int i : range(1,sz)) {
		for (int j : range(1, sz)) {
			dp[i][j][0] = dp[i][j - 1][0] + dp[i][j - 1][1];
			if (j % 2 == 1) {
				dp[i][j][1] = dp[i - 1][j - 1][0] + dp[i - 1][j - 1][1] + dp[i - 1][j][1];
			}
			else {
				dp[i][j][1] = dp[i - 1][j - 1][0] + dp[i - 1][j][1];
			}
			dp[i][j][0] %= mod;
			dp[i][j][1] %= mod;
		}
	}
	int N, K;
	cin >> K >> N;
	for (int k : range(2, 2 * K + 1)) {
		LL ret = 0;
		if (k % 2 == 1) {
			int p = 0;
			for (int i : range(1,K + 1)) {
				if (1 <= k - i && k - i <= K)p++;
			}
			for (int i : range(N+1)) {
				int a = N - i;
				int b = K - p;
				LL ans = 0;
				ans += dp[i][p][0] + dp[i][p][1];
				ans %= mod;
				LL c;
				if (b == 0 && a > 0)c = 0;
				else if (b == 0 && a == 0)c = 1;
				else c = Comb(a + b - 1, b - 1);
				ans *= c;
				ans %= mod;
				ret += ans;
			}
		}
		else {
			int p = 0;
			for (int i : range(1, K + 1)) {
				if (1 <= k - i && k - i <= K && i != k - i)p++;
			}
			for (int i : range(N + 1)) {
				int a = N - i;
				int b = K - p - 1;
				LL ans = 0;
				ans += dp[i][p][0] + dp[i][p][1];
				ans %= mod;
				LL c;
				if (b == 0 && a > 0)c = 0;
				else if (b == 0 && a == 0)c = 1;
				else c = Comb(a + b - 1, b - 1);
				ans *= c;
				ans %= mod;
				ret += ans;
			}
			for (int i : range(N)) {
				int a = N - i - 1;
				int b = K - p - 1;
				LL ans = 0;
				ans += dp[i][p][0] + dp[i][p][1];
				ans %= mod;
				LL c;
				if (b == 0 && a > 0)c = 0;
				else if (b == 0 && a == 0)c = 1;
				else c = Comb(a + b - 1, b - 1);
				ans *= c;
				ans %= mod;
				ret += ans;
			}

		}
		cout << ret%mod << endl;
	}
	return 0;
}


Measured memory_bytes: 158464