#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const double eps = 1e-9;
vector<int> p, vg;
set<pair<int, int> > done;
bool cando(int i, int j) {
  return done.find(make_pair(min(i, j), max(i, j))) == done.end();
}
int moves = 0;
void doswap(int i, int j) {
  ++moves;
  assert(i != j);
  assert(min(i, j) >= 0 && max(i, j) < int((vg).size()));
  assert(cando(i, j));
  printf("%d %d\n", min(i, j) + 1, max(i, j) + 1);
  swap(p[i], p[j]);
  swap(vg[i], vg[j]);
  done.insert(make_pair(min(i, j), max(i, j)));
}
void brute_force(vector<int> pp) {
  int N = int((pp).size());
  vector<pair<int, int> > op;
  vector<int> aim = pp;
  sort((aim).begin(), (aim).end());
  for (int i = (0); i < (N); i++)
    for (int j = (0); j < (i); j++)
      if (cando(i, j)) op.push_back(make_pair(i, j));
  sort((op).begin(), (op).end());
  do {
    vector<int> tmp = pp;
    for (auto it : op) {
      swap(tmp[it.first], tmp[it.second]);
    }
    if (tmp == aim) {
      for (auto it : op) doswap(it.first, it.second);
      return;
    }
  } while (next_permutation((op).begin(), (op).end()));
  cerr << "EPIC FAIL\n";
}
int main() {
  ios::sync_with_stdio(false);
  int N;
  cin >> N;
  if (N == 1) {
    cout << "YES\n";
    return 0;
  }
  if ((N * (N - 1)) % 4 != 0) {
    cout << "NO\n";
    return 0;
  }
  printf("YES\n");
  p = vector<int>(N);
  for (int i = (0); i < (N); i++) p[i] = i;
  vg = p;
  while (true) {
    vector<int> ids;
    for (int i = (0); i < (N); i++)
      if (p[i] != -1) ids.push_back(i);
    int S = int((ids).size());
    if (S <= 1) break;
    assert(ids[S - 1] == S - 1);
    if (S <= 5) {
      vector<int> tmp(S);
      for (int i = (0); i < (S); i++) tmp[i] = p[i];
      brute_force(tmp);
      break;
    }
    vector<int> x(S - 1);
    for (int i = (0); i < (S - 1); i++) x[i] = i;
    random_shuffle((x).begin(), (x).end());
    if (p[S - 1] == S - 1) {
      bool ok = false;
      while (!ok) {
        int z1 = max((rand() % (S - 1)), rand() % (S - 1));
        int z2 = max((rand() % (S - 1)), rand() % (S - 1));
        if (z1 == z2) continue;
        if (!cando(z1, S - 1) || !cando(z2, S - 1)) continue;
        if (!cando(z1, z2)) continue;
        ok = true;
        doswap(z2, S - 1);
        doswap(z2, z1);
        for (auto i : x) {
          if (i != z1 && i != z2 && cando(i, S - 1)) {
            doswap(i, S - 1);
          }
        }
        doswap(z1, S - 1);
      }
    } else {
      int id_largest = -1;
      for (int i = (0); i < (S); i++)
        if (p[i] == S - 1) id_largest = i;
      assert(id_largest != -1);
      if (cando(id_largest, S - 1)) {
        for (auto i : x) {
          if (i != id_largest && cando(i, S - 1)) {
            doswap(i, S - 1);
          }
        }
        doswap(id_largest, S - 1);
      } else {
        int z = S - 2;
        while (!cando(z, S - 1) || !cando(id_largest, z)) --z;
        assert(z >= 0);
        assert(z != id_largest);
        doswap(id_largest, z);
        for (auto i : x) {
          if (i != z && cando(i, S - 1)) {
            doswap(i, S - 1);
          }
        }
        doswap(z, S - 1);
      }
    }
    assert(p[S - 1] == S - 1);
    p[S - 1] = -1;
  }
  assert(moves == (N * (N - 1)) / 2);
  for (int i = (0); i < (N); i++) assert(vg[i] == i);
  return 0;
}
