#include <bits/stdc++.h>
using namespace std;
class gc {
 public:
  int x, y, prio;
  gc(int x, int y, int p) : x(x), y(y), prio(p) {}
};
bool operator<(const gc& lhs, const gc& rhs) { return lhs.prio < rhs.prio; }
unordered_map<int, unordered_map<int, int> > grid;
unordered_map<int, unordered_map<int, int> > grid_prio;
priority_queue<gc> pq;
int added = 0;
int numshifts = 8;
int shifts[][2] = {{2, -1}, {2, 1},   {1, 2},  {1, -2},
                   {-1, 2}, {-1, -2}, {-2, 1}, {-2, -1}};
int bonus[] = {0, 1, 10, 100, 0};
void add4(int x, int y) {
  grid[x][y] = 4;
  added++;
  for (int c = 0; c < numshifts; c++) {
    int nx = x + shifts[c][0], ny = y + shifts[c][1];
    int newGrid = grid[nx][ny] + 1;
    grid[nx][ny] = newGrid;
    if (newGrid == 4) {
      add4(nx, ny);
    }
    if (newGrid <= 4) {
      for (int d = 0; d < numshifts; d++) {
        int nnx = nx + shifts[d][0], nny = ny + shifts[d][1];
        int newPrio = grid_prio[nnx][nny] + bonus[newGrid] - bonus[newGrid - 1];
        grid_prio[nnx][nny] = newPrio;
        pq.push(gc(nnx, nny, newPrio));
      }
    }
  }
}
int main(void) {
  int n;
  cin >> n;
  add4(0, 0);
  int placed = 1;
  cout << "0 0" << endl;
  while (!pq.empty() && placed != n) {
    gc nextP = pq.top();
    pq.pop();
    if (nextP.prio != grid_prio[nextP.x][nextP.y]) {
      continue;
    }
    if (grid[nextP.x][nextP.y] != 0) {
      continue;
    }
    add4(nextP.x, nextP.y);
    placed++;
    cout << nextP.x << " " << nextP.y << endl;
  }
  return 0;
}
