#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  char c;
  int f = 1;
  while (!isdigit(c = getchar()))
    if (c == '-') f = -1;
  x = (c & 15);
  while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + (c & 15);
  x *= f;
}
vector<pair<int, int> > ans;
int n, i, del[15005];
vector<int> v[15005];
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    pq;
void merge(int x, int y) {
  int i;
  del[x] = 1;
  for ((i) = 0; (i) < (v[x].size()); (i)++) {
    ans.push_back(make_pair(v[x][i], v[y][i]));
    v[y].push_back(v[x][i]);
  }
}
void solve() {
  while (pq.size() > 1) {
    int x = pq.top().second;
    pq.pop();
    if (v[x].size() != pq.top().first) continue;
    int y = pq.top().second;
    pq.pop();
    merge(x, y);
    pq.push(make_pair(v[y].size(), y));
  }
}
int main() {
  read(n);
  for ((i) = 1; (i) <= (n); (i)++) {
    v[i].push_back(i);
    pq.push(make_pair(1, i));
  }
  solve();
  int t = 1;
  while (t * 2 <= n) t *= 2;
  if (t != n) {
    for ((i) = 1; (i) <= (n); (i)++)
      if (v[i].size() == t) break;
    t = t + t - n;
    while (t--) {
      int x = v[i].back();
      v[i].pop_back();
      del[x] = 0;
      v[x].clear();
      v[x].push_back(x);
    }
    while (!pq.empty()) pq.pop();
    for ((i) = 1; (i) <= (n); (i)++) {
      if (!del[i]) pq.push(make_pair(v[i].size(), i));
    }
    solve();
  }
  printf("%d\n", ans.size());
  for (__typeof((ans).begin()) it = (ans).begin(); it != (ans).end(); ++it)
    printf("%d %d\n", it->first, it->second);
  return 0;
}
