#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& vc) {
  o << "{";
  for (const T& v : vc) o << v << ",";
  o << "}";
  return o;
}
using ll = long long;
template <class T>
using V = vector<T>;
template <class T>
using VV = vector<vector<T>>;
using P = pair<int, int>;
bool judge(V<P> vs) {
  V<int> dx = {-2, -2, -1, 1, 2, 2, 1, -1};
  V<int> dy = {-1, 1, 2, 2, 1, -1, -2, -2};
  {
    int mx = 1000, my = 1000;
    for (P p : vs) {
      mx = min(mx, p.first);
      my = min(my, p.second);
    }
    for (P& p : vs) {
      p.first -= mx;
      p.second -= my;
    }
  }
  int N = vs.size();
  int X = 1000;
  VV<bool> is(X, V<bool>(X, false));
  VV<int> reach(X, V<int>(X));
  int cnt = 0;
  function<void(int, int)> add = [&](int x, int y) {
    is[x][y] = true;
    cnt++;
    for (int d = 0; d < (int)(8); d++) {
      int nx = x + dx[d];
      int ny = y + dy[d];
      if (0 <= nx && nx < X && 0 <= ny && ny < X && !is[nx][ny]) {
        reach[nx][ny]++;
        if (reach[nx][ny] == 4) {
          add(nx, ny);
        }
      }
    }
  };
  for (P p : vs) {
    add(p.first, p.second);
  }
  cout << "cnt"
       << " = " << (cnt) << endl;
  return cnt >= N * N / 10;
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int N;
  cin >> N;
  V<P> vs;
  for (int i = 0; i < (int)(1000); i++) {
    vs.push_back(P(i, i));
    vs.push_back(P(i + 2, i));
    if (i) vs.push_back(P(i, -i));
    if (i) vs.push_back(P(i + 2, -i));
  }
  while ((int)vs.size() > N) vs.pop_back();
  for (P p : vs) {
    cout << p.first << " " << p.second << endl;
  }
}
