#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3fffffff;
const long long _INF = 0x7ffffffffffffffll;
const double EPS = 1e-9;
const double PI = acos(-1.0);
template <class T, class INT>
inline T pow(T x, INT y) {
  T res(1);
  for (T tt(x); y; y /= 2) {
    if (y & 1) res *= tt;
    tt *= tt;
  }
  return res;
}
template <class T, class INT>
inline T pow(T x, INT y, T p) {
  T res(1);
  for (T tt(x); y; y /= 2) {
    if (y & 1) res = res * tt % p;
    tt = tt * tt % p;
  }
  return res;
}
int toInt(string s) {
  int x = 0;
  istringstream sin(s);
  sin >> x;
  return x;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
template <class INT>
inline INT gcd(INT x, INT y) {
  return y ? gcd(y, x % y) : x;
}
template <class INT>
inline int calc_bits(INT x) {
  return x ? (x & 1) + calc_bits(x >> 1) : 0;
}
const int MAXD = 80000 + 10;
const int MAXM = 200 + 1;
int tmp, sumx, sumy, cnt, n;
vector<pair<int, int> > a;
bool check[MAXD];
struct Graph {
  int head[MAXM], next[MAXD], vis[MAXD], tot;
  inline void add(int u, int v) {
    next[++tot] = head[u];
    vis[head[u] = tot] = v;
  }
} x, y;
inline int abs(pair<int, int> a) {
  return ((a.first) * (a.first)) + ((a.second) * (a.second));
}
inline bool cmp(pair<int, int> a, pair<int, int> b) {
  return atan2(a.second, a.first) < atan2(b.second, b.first) - EPS;
}
inline bool _cmp(pair<int, int> a, pair<int, int> b) { return abs(a) < abs(b); }
int main(int argc, char* argv[]) {
  for (int i = 0; i < (MAXM); ++i)
    for (int j = 0; j < (MAXM); ++j) {
      tmp = abs(pair<int, int>(i, j));
      if (!check[tmp]) check[tmp] = true, a.push_back(pair<int, int>(i, j));
    }
  cin >> n;
  sort((a).begin(), (a).end(), _cmp);
  for (int i = 0; i < (n + 1); ++i) sumx += a[i].first, sumy += a[i].second;
  if (sumx + sumy & 1) {
    sumx += a[n + 1].first, sumy += a[n + 1].second;
    for (int i = (n); i > (0); --i)
      if (!(sumx - a[i].first & 1) && !(sumy - a[i].second & 1)) {
        swap(a[i], a[n + 1]);
        break;
      }
  } else if (sumx & 1)
    for (int i = (1); i < (n + 1); ++i)
      if (a[i].first + a[i].second & 1) {
        swap(a[i].first, a[i].second);
        break;
      }
  for (int i = (1); i < (n + 1); ++i)
    x.add(a[i].first, i), y.add(a[i].second, i);
  for (int i = (200); i > (0); --i)
    for (int j = x.head[i]; j; j = x.next[j])
      if (cnt > 0)
        a[x.vis[j]].first = -a[x.vis[j]].first, cnt -= i;
      else
        cnt += i;
  for (int i = (200); i > (0); --i)
    for (int j = y.head[i]; j; j = y.next[j])
      if (cnt > 0)
        a[y.vis[j]].second = -a[y.vis[j]].second, cnt -= i;
      else
        cnt += i;
  sort(a.begin() + 1, a.begin() + n + 1, cmp);
  sumx = sumy = 0;
  cout << "YES" << endl;
  for (int i = (1); i < (n + 1); ++i) {
    cout << sumx << " " << sumy << endl;
    sumx += a[i].first, sumy += a[i].second;
  }
}
