Problem:
Score : 800 points

Problem Statement

Takahashi is doing a research on sets of points in a plane.
Takahashi thinks a set S of points in a coordinate plane is a good set when S satisfies both of the following conditions:

The distance between any two points in S is not \sqrt{D_1}.

The distance between any two points in S is not \sqrt{D_2}.

Here, D_1 and D_2 are positive integer constants that Takahashi specified.

Let X be a set of points (i,j) on a coordinate plane where i and j are integers and satisfy 0 ≤ i,j < 2N.

Takahashi has proved that, for any choice of D_1 and D_2, there exists a way to choose N^2 points from X so that the chosen points form a good set.
However, he does not know the specific way to choose such points to form a good set.
Find a subset of X whose size is N^2 that forms a good set.

Constraints

1 ≤ N ≤ 300

1 ≤ D_1 ≤ 2×10^5

1 ≤ D_2 ≤ 2×10^5

All values in the input are integers.

Input

Input is given from Standard Input in the following format:

N D_1 D_2

Output

Print N^2 distinct points that satisfy the condition in the following format:

x_1 y_1
x_2 y_2
:
x_{N^2} y_{N^2}

Here, (x_i,y_i) represents the i-th chosen point.
0 ≤ x_i,y_i < 2N must hold, and they must be integers.
The chosen points may be printed in any order.
In case there are multiple possible solutions, you can output any.

Sample Input 1

2 1 2

Sample Output 1

0 0
0 2
2 0
2 2

Among these points, the distance between 2 points is either 2 or 2\sqrt{2}, thus it satisfies the condition.

Sample Input 2

3 1 5

Sample Output 2

0 0
0 2
0 4
1 1
1 3
1 5
2 0
2 2
2 4

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>

using namespace std;

int n,D1,D2,sign[700][700],cnt,x[700],y[700];
pair<int,int> Ans[100010];
int dir[4][2]={{1,-1},{1,1},{-1,1},{-1,-1}};
vector<pair<int,int> > V1,V2;
inline int solve()
{
	cnt=0; memset(sign,0,sizeof sign);
	for(int i=0;i<2*n;i++) for(int j=0;j<2*n;j++) if(!sign[x[i]][y[j]])
	{
		++cnt; Ans[cnt]=make_pair(x[i],y[j]);
		if(cnt==n*n) return cnt;
		for(int t=0;t<V1.size();t++) for(int k=0;k<4;k++)
		{
			int vx=dir[k][0]*V1[t].first+x[i];
			int vy=dir[k][1]*V1[t].second+y[j];
			if(vx<0||vy<0||vx>2*n||vy>2*n) continue;
			sign[vx][vy]=1;
		}
		for(int t=0;t<V2.size();t++) for(int k=0;k<4;k++)
		{
			int vx=dir[k][0]*V2[t].first+x[i];
			int vy=dir[k][1]*V2[t].second+y[j];
			if(vx<0||vy<0||vx>2*n||vy>2*n) continue;
			sign[vx][vy]=1;
		}
	}	
	return cnt;
}
int main()
{
	cin >> n >> D1 >> D2;
	for(int j=0;j*j<=D1;j++)
	{
		int t=D1-j*j;
		int x=sqrt(t);
		while((x+1)*(x+1)<=t) x++;
		while(x*x>t) x--;
		if(x*x==t) V1.push_back(make_pair(j,x));
	}
	for(int i=0;i<2*n;i++) x[i]=y[i]=i;
	while(solve()!=cnt) random_shuffle(x,x+2*n),random_shuffle(y,y+2*n);
	for(int i=1;i<=cnt;i++) printf("%d %d\n",Ans[i].first,Ans[i].second);
	return 0;
}