#include <bits/stdc++.h>
using namespace std;
vector<pair<long, long>> ans;
void solveN(long n, long start) {
  if (n == 1) return;
  if (n == 2)
    ans.emplace_back(make_pair(start, start + 1));
  else {
    solveN(n / 2, start);
    solveN(n / 2, start + n / 2);
    for (long i = 0; i < n / 2; ++i) {
      ans.emplace_back(make_pair(start + i, start + i + n / 2));
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, t;
  cin >> n;
  t = n;
  vector<long> powers;
  while (n > 0) {
    long i = log2(n);
    powers.emplace_back(i);
    n -= pow(2, i);
  }
  n = t;
  long start = 1;
  for (long power : powers) {
    solveN(pow(2, power), start);
    start += pow(2, power);
  }
  long curPos = 1;
  while (powers.size() > 2) {
    long curN = pow(2, powers[powers.size() - 1]);
    powers.erase(powers.begin() + powers.size() - 1);
    long lastPos = curPos - 1;
    for (long i = 0; i < curN - lastPos; ++i) {
      ans.emplace_back(make_pair(curPos, n - i));
      curPos++;
    }
    for (long i = lastPos; i > 0; --i) {
      ans.emplace_back(make_pair(curPos, i));
      curPos++;
    }
    curN *= 2;
    while (powers.size() > 1) {
      if (powers[powers.size() - 1] == log2(curN)) {
        powers.erase(powers.begin() + powers.size() - 1);
        long mergePos = n - (2 * curN) + curPos;
        for (long i = 0; i < curPos - 1; ++i) {
          ans.emplace_back(make_pair(i + 1, mergePos));
          mergePos++;
        }
        for (long i = 0; i < curN - curPos + 1; ++i) {
          ans.emplace_back(make_pair(n - i, mergePos));
          mergePos++;
        }
        curN *= 2;
      } else
        break;
    }
    powers.emplace_back(log2(curN));
  }
  cout << ans.size() << endl;
  for (auto& an : ans) {
    cout << an.first << " " << an.second << endl;
  }
  return 0;
}
