#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <queue>
#include <vector>

using namespace std;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int n,D1,D2,id[650][650],col[400000][3];

vector <pair <int,int>> d[3];

inline void dfs(int u,int c)
{
	int x=(u-1)/(2*n)+1,y=(u-1)%(2*n)+1;
	//cout << x << " " << y << endl;
	for (int i=0;i<d[c].size();i++)
	{
		pair <int,int> rhs=d[c][i];
		int nx=x+rhs.first,ny=y+rhs.second;
		if (nx>=1 && nx<=2*n && ny>=1 && ny<=2*n)
		{
			int rid=id[nx][ny];
			if (!col[rid][c])
			{
				col[rid][c]=col[u][c]==1?2:1;
				dfs(rid,c);
			}
		}
	}
}

int main()
{
	n=read(),D1=read(),D2=read();
	for (int i=0;i<=D1;i++)
	{
		int j=sqrt(D1-i*i);
		if (i*i+j*j==D1)
		{
			d[1].push_back({i,j});
			d[1].push_back({-i,j});
			d[1].push_back({i,-j});
			d[1].push_back({-i,-j});
			//if (i!=0)
			//	break;
		}
	}
	for (int i=0;i<=D2;i++)
	{
		int j=sqrt(D2-i*i);
		if (i*i+j*j==D2)
		{
			d[2].push_back({i,j});
			d[2].push_back({-i,j});
			d[2].push_back({i,-j});
			d[2].push_back({-i,-j});
			//if (i!=0)
			//	break;
		}
	}
	for (int i=1;i<=n*2;i++)
	{
		for (int j=1;j<=n*2;j++)
			id[i][j]=(i-1)*2*n+j;
	}
	for (int i=1;i<=n*2;i++)
	{
		for (int j=1;j<=n*2;j++)
		{
			int rhs=id[i][j];
			if (!col[rhs][1])
			{
				col[rhs][1]=1;
				dfs(rhs,1);
			}
			if (!col[rhs][2])
			{
				col[rhs][2]=1;
				dfs(rhs,2);
			}
		}
	}
	int cnt=0;
	for (int i=1;i<=n*2;i++)
	{
		for (int j=1;j<=n*2;j++)
		{
			int rid=id[i][j];
			if (col[rid][1]==1 && col[rid][2]==1)
			{
				cout << i-1 << " " << j-1 << endl;
				cnt++;
			}
			if (cnt==n*n)
				return 0;
		}
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pi;
#define f first
#define s second
#define FAST ios_base::sync_with_stdio(0); cin.tie(0);
#define all(x) x.begin(),x.end()
const int maxn = 6010;
const int mod = 998244353;


int fac[maxn];
map <int,int> mp;


int expo(int x, int exp) {
	int res = 1, base = x;
	while (exp) {
		if (exp & 1) res = (res * base) % mod;
		base = (base*base) % mod;
		exp >>= 1;
	}
	return res;
}

int inv(int x) {
	if (mp.find(x) != mp.end()) return mp[x];
	else return mp[x] = expo(x,mod-2);
}


int choose(int N, int k) {
	return fac[N] * inv(fac[k]*fac[N - k] % mod) % mod;
}

int K,n;

int32_t main() {
	FAST
	cin >> K >> n;
	fac[0] = 1;
	for (int i =1; i<maxn;i++) fac[i] = fac[i-1] * i % mod;
	
	for (int i = 2;i <= 2 * K; i++) {
		int ans = 0;
		int pairs = i/2 - max(1ll, i - K) + 1;
		
		for (int x = 0; x <= pairs; x++) {
			if (n < x * 2) break;
			int v = choose(n - x*2 + K -1, n - x * 2) * choose(pairs,x) % mod;
			if (x % 2 == 0) ans = (ans + v) % mod; 
			else ans = (ans - v + mod) % mod;
			//cout << i << " " << x << " " << v << " " << ans << "\n";
		}
		cout << ans << "\n";
	}
}







