#include <bits/stdc++.h>
struct itv {
  int s1;
  int e1;
  int s2;
  int e2;
  int gr;
  void up() {
    gr = (e2 - s2) + 1;
    if (e1) {
      gr += (e1 - s1) + 1;
    };
  };
};
std::vector<std::pair<int, int> > aus;
void merge(int s1, int s2, int sz) {
  for (int i = 0; i < sz; i++) {
    aus.push_back({s1 + i, s2 + i});
  };
};
itv tt[1000];
int main(void) {
  int n;
  scanf("%d", &n);
  int akt = 1;
  for (int i = 1; i <= 20; i++) {
    int sz = (1 << i);
    if (sz > n) break;
    for (int j = 1; j <= n; j += sz) {
      int s1 = j;
      int s2 = j + (sz / 2);
      if (s1 + sz > n + 1) break;
      merge(s1, s2, sz / 2);
    };
  };
  akt = n;
  std::vector<int> pw;
  for (int i = 0; i <= 20; i++) {
    if (n & (1 << i)) {
      pw.push_back(i);
      tt[i].s2 = (akt - (1 << i)) + 1;
      tt[i].e2 = akt;
      tt[i].s1 = 0;
      tt[i].e1 = 0;
      tt[i].up();
      akt -= (1 << i);
    };
  };
  if (pw.size() > 2) {
    int ak = 1;
    for (int i = 0; i < pw.size() - 2; i++) {
      int ap = pw[i];
      int np = pw[i + 1];
      int ss = tt[ap].e2 - tt[ap].s2 + 1;
      if (!i) {
        merge(tt[ap].s2, ak, ss);
        tt[ap].s1 = ak;
        ak += (ss);
        tt[ap].e1 = ak - 1;
      };
      tt[ap].up();
      while (tt[ap].gr < tt[np].gr) {
        merge(tt[ap].s1, ak, tt[ap].e1 - tt[ap].s1 + 1);
        ak += (tt[ap].e1 - tt[ap].s1 + 1);
        merge(tt[ap].s2, ak, ss);
        ak += (ss);
        tt[ap].e1 = ak - 1;
        tt[ap].up();
      };
      merge(tt[ap].s2, tt[np].s2, ss);
      merge(tt[ap].s1, tt[np].s2 + ss, tt[ap].e1 - tt[ap].s1 + 1);
      tt[np].e2 = tt[ap].e2;
      tt[np].s1 = tt[ap].s1;
      tt[np].e1 = tt[ap].e1;
      tt[np].up();
    };
  };
  printf("%d\n", aus.size());
  for (auto i : aus) {
    printf("%d %d\n", i.first, i.second);
  };
  return 0;
};
