#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
bool FLAG = 0;
using namespace std;
const long long MOD = 1e9 + 7, N = (long long)2e6 + 222;
const long long INF = (long long)1e18;
const long double eps = (long double)1e-6;
long long dx[] = {0, -1, 0, 1, 0};
long long dy[] = {0, 0, 1, 0, -1};
long long n;
vector<long long> v, a;
vector<pair<long long, long long> > ans;
void get(long long l, long long r) {
  if (l >= r) return;
  long long mid = (l + r) / 2;
  for (long long i = l; i <= mid; ++i) {
    ans.push_back({i, mid + i - l + 1});
  }
  get(l, mid);
  get(mid + 1, r);
}
inline void solve() {
  cin >> n;
  long long l = 1, r = 1;
  long long n1 = n;
  for (long long i = 20; i >= 0; --i) {
    if ((1 << i) <= n) {
      r = l + (1 << i) - 1;
      get(l, r);
      v.push_back(1 << i);
      l = r + 1;
      n -= (1 << i);
    }
  }
  n = n1;
  if ((long long)(v.size()) <= 2) {
    cout << (long long)(ans.size()) << endl;
    for (long long i = 0; i < (long long)(ans.size()); ++i) {
      cout << ans[i].first << " " << ans[i].second << endl;
    }
    return;
  }
  reverse(v.begin(), v.end());
  long long x = v[0];
  for (long long i = n; i >= n - v[0] + 1; --i) a.push_back(i);
  long long len = v[(long long)(v.size()) - 1];
  n1 = n - v[0];
  for (long long i = 1; i < (long long)(v.size()); ++i) {
    if ((long long)(v.size()) - 1 == i) {
      break;
    }
    while (v[i] != (long long)(a.size())) {
      for (long long j = 0; j < (long long)(a.size()); ++j) {
        ans.push_back(make_pair(a[j], len - j));
      }
      long long w = (long long)(a.size());
      for (long long j = len - (long long)(a.size()) + 1; j <= len; ++j)
        a.push_back(j);
      len -= w;
    }
    long long pos = 0;
    for (long long j = n1 - v[i] + 1; j <= n1; ++j) {
      ans.push_back({a[pos], j});
      pos++;
    }
    for (long long j = n1 - v[i] + 1; j <= n1; ++j) {
      a.push_back(j);
    }
    n1 -= v[i];
  }
  cout << (long long)(ans.size()) << endl;
  for (long long i = 0; i < (long long)(ans.size()); ++i) {
    cout << ans[i].first << " " << ans[i].second << endl;
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
