#include <bits/stdc++.h>
std::vector<std::pair<int, int> > ans;
std::vector<int> combine(std::vector<int> a, std::vector<int> b) {
  for (int i = 0; i < a.size(); i++) {
    ans.push_back({a[i] + 1, b[i] + 1});
  }
  while (b.size() > 0) {
    a.push_back(b[b.size() - 1]);
    b.pop_back();
  }
  return a;
}
std::pair<std::vector<int>, std::vector<int> > split(std::vector<int> vec,
                                                     int a, int b) {
  std::vector<int> x, y;
  for (int i = 0; i < a; i++) x.push_back(vec[i]);
  for (int i = a; i < (a + b); i++) y.push_back(vec[i]);
  return {x, y};
}
std::vector<int> compress(int k, std::vector<int> vec[]) {
  if (k == 1) return vec[0];
  if (k == 2) return combine(vec[0], vec[1]);
  return combine(compress(k / 2, vec), compress(k / 2, vec + k / 2));
}
std::vector<int> vec[15001];
std::vector<std::vector<int> > pows;
signed main() {
  int n;
  std::cin >> n;
  for (int i = 0; i < n; i++) vec[i].push_back(i);
  int last = 0;
  for (int i = 0; i < 17; i++) {
    if ((n >> i) & 1) {
      pows.push_back(compress((1 << i), vec + last));
      last += (1 << i);
    }
  }
  if (pows.size() > 2) {
    std::vector<int> cur = pows[0];
    int max = pows.size() - 1;
    for (int i = 0; i < pows.size() - 2; i++) {
      while (cur.size() < pows[i + 1].size()) {
        std::vector<int> x, y;
        int m = cur.size();
        for (int i = 0; i < m; i++) x.push_back(pows[max][i]);
        for (int i = m; i < pows[max].size(); i++) y.push_back(pows[max][i]);
        pows[max] = y;
        cur = combine(x, cur);
      }
      cur = combine(cur, pows[i + 1]);
    }
  }
  std::cout << ans.size() << std::endl;
  for (auto j : ans) std::cout << j.first << " " << j.second << std::endl;
  return 0;
}
