#include<bits/stdc++.h>
using namespace std;
#define N 8005
#define MOD 998244353
#define ll long long
#define debug(a) cout<<#a<<": ";for(auto i:a)cout<<i<<" ";cout<<endl;
#define trace(a) cout<<#a<<": "<<a<< endl;
#define int ll
inline ll modexp(ll a,ll b,ll m)
{
    ll res=1;
    a%=m;
    while(b)
    {
        if(b&1LL)
            res=(res*a)%m;
        a=(a*a)%m;
        b>>=1LL;
    }
    return res%m;
}

struct comb {
	int f[N];
	bool isInitialised = false;
	void init(int n = N-1) {
		if(isInitialised) return;
		f[0] = 1;
		for(int i = 1;i <= n;i++) {
			f[i] = (1LL*f[i-1]*i)%MOD;
		}
		isInitialised = true;
	}
	ll ncr(int n,int r) {
		if(!isInitialised) {
			init();
		}
		assert(n >= r);
		return (((1LL * f[n] * modexp(f[r],MOD-2,MOD)) %MOD) * modexp(f[n-r],MOD-2,MOD))%MOD;
	}
	int fac(int n) {
		if(!isInitialised) {
			init();
		}
		return f[n]%MOD;
	}
};
int a[N];
int ans[N];
comb cb;
int dp[N][N],ps[N][N];
// rec(id,n) = rec(id-1,n) + rec(id-1,n-1) + rec(id-1,n-2) ...
void pre() {
	int i,j;
	dp[0][0] = 1;
	ps[0][0] = 1;
	for(i = 1;i <= N-1;i++) {
		ps[0][i] = (ps[0][i-1] + dp[0][i])%MOD;
	}
	for(i = 1;i <= N-1;i++) {
		dp[i][0] = 1;
		for(j = 1;j <= N-1;j++) {
			dp[i][j] = ps[i-1][j];
		}
		ps[i][0] = 1;
		for(j = 1;j <= N-1;j++) {
			ps[i][j] = (ps[i][j-1] + dp[i][j])%MOD;
		}
	}
}
int np[N];
int solve(ll t, ll n,ll k) {
	// a+b = t
	// All these have different values
	ll numberOfPairs = np[t];
	ll ans = 0;
	// trace(numberOfPairs);
	// Number of pairs having one value
	for(ll p = 0;p <= numberOfPairs;p++) {
		// having 0 values
		ll q = numberOfPairs - p;
		if(p > n) break;
		// remaining values
		ll r = k - numberOfPairs*2 + p;
		if(r < 0) continue;
		// trace(r);
		ans += (((cb.ncr(numberOfPairs,p)*modexp(2,p,MOD))%MOD) * dp[r][n-p])%MOD;
		ans %= MOD;
		// trace(ans);
	}
	return ans%MOD;
}
int calc(ll t, ll n,ll k) {
	// a+b = t
	// All these have different values
	ll numberOfPairs = np[t];
	// numberOfPairs--;
	ll ans = 0;
	// trace(numberOfPairs);
	// Number of pairs having one value
	for(ll p = 0;p <= numberOfPairs;p++) {
		// having 0 values
		ll q = numberOfPairs - p;
		if(p > n) break;
		// remaining values
		// same value pair chosen
		// trace(p);
		if(p > 0) {
			ll r = k - numberOfPairs*2 + 1 + p - 1;
			if(r < 0) continue;
			// trace(r);
			ans += (((cb.ncr(numberOfPairs-1,p-1)*modexp(2,p-1,MOD))%MOD) * dp[r][n-p])%MOD;
			ans %= MOD;
			// trace(ans);
		}
		// not chosen
		if(p < numberOfPairs) {
			ll r = k - numberOfPairs*2 + 1 + p;
			if(r < 0) continue;
			// trace(r);
			ans += (((cb.ncr(numberOfPairs-1,p)*modexp(2,p,MOD))%MOD) * dp[r][n-p])%MOD;
			ans %= MOD;
			// trace(ans);
		}
	}

	return ans%MOD;
}

// exp : 401380485
// got : 516252792
signed main() {
	ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0);
	int i,j,k,l,m,n,t;
	cin >> k >> n;
	int mid = k+1;
	pre();
	cb.init();
	for(i = 1;i <= k;i++) {
		for(j = i;j <= k;j++) {
			np[i+j]++;
		}
	}
	// cout << calc(578,n,k) << endl;
	for(int i = 3;i <= 2*k;i += 2) {
		ans[i] = solve(i,n,k);
		// int j = i-1;
		// ans[j] = ans[mid-j+mid] = ans[i];
	}
	for(int i = 2;i <= 2*k;i += 2) {
		ans[i] = calc(i,n,k);
	}
	if(mid%2 == 0) {
		ans[mid] = calc(mid,n,k);
	}
	for(i = 2;i <= 2*k;i++) {
		// if(ans[i] == 0) assert(false);
		cout << ans[i] << endl;
	}

}

Measured memory_bytes: 1001728