#include <bits/stdc++.h>
using namespace std;
vector<int> ch[15005];
vector<int> vec;
vector<pair<int, int> > ans;
void solve() {
  int i, j, k, a, b = 0, c, n, m, t, l;
  scanf("%d", &n);
  b = 0;
  for (i = 20; i >= 0; i--) {
    a = 1 << i;
    if (a & n) {
      vec.push_back(a);
      for (j = 2; j <= a; j *= 2) {
        for (k = 1; k <= (a / j); k++) {
          for (t = 1; t <= j / 2; t++) {
            ans.push_back({b + (k - 1) * j + t, b + (k - 1) * j + t + j / 2});
          }
        }
      }
      for (j = b + 1; j <= b + a; j++) ch[vec.size() - 1].push_back(j);
      b += a;
    }
  }
  while (vec.size() > 2) {
    l = vec.size();
    if (vec[l - 1] == vec[l - 2]) {
      for (i = 0; i < ch[l - 1].size(); i++) {
        ans.push_back({ch[l - 1][i], ch[l - 2][i]});
      }
      for (i = 0; i < ch[l - 1].size(); i++) ch[l - 2].push_back(ch[l - 1][i]);
      vec.pop_back();
      vec[l - 2] *= 2;
      continue;
    }
    for (i = 0; i < vec[l - 1]; i++) {
      ch[l - 1].push_back(ch[0].back());
      ch[0].pop_back();
    }
    for (i = 0; i < vec[l - 1]; i++) {
      ans.push_back({ch[l - 1][i], ch[l - 1][i + vec[l - 1]]});
    }
    vec[l - 1] *= 2;
  }
  printf("%d\n", ans.size());
  for (i = 0; i < ans.size(); i++)
    printf("%d %d\n", ans[i].first, ans[i].second);
}
int main() {
  int T = 1;
  while (T--) {
    solve();
  }
}
