#include <bits/stdc++.h>
using namespace std;
class Init {
 public:
  Init() noexcept try {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
  } catch (...) {
    cerr << "Init constructor threw an exception" << endl;
    terminate();
  }
} init_ __attribute__((unused));
using ll = long long;
using ld = long double;
using pi = pair<int, int>;
using pl = pair<ll, ll>;
using ti = tuple<int, int, int>;
using tl = tuple<ll, ll, ll>;
using tii = tuple<int, int, int, int>;
using tll = tuple<ll, ll, ll, ll>;
using vi = vector<int>;
using vl = vector<ll>;
using vpi = vector<pi>;
using vpl = vector<pl>;
using vti = vector<ti>;
using vtl = vector<tl>;
using vtii = vector<tii>;
using vtll = vector<tll>;
using vvi = vector<vi>;
using vvl = vector<vl>;
template <typename T>
istream &operator>>(istream &in, vector<T> &v);
template <typename U, typename V>
istream &operator>>(istream &in, pair<U, V> &p);
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v);
template <typename U, typename V>
ostream &operator<<(ostream &out, const pair<U, V> &p);
template <typename T>
istream &operator>>(istream &in, vector<T> &v) {
  for (T &i : v) in >> i;
  return in;
}
template <typename U, typename V>
istream &operator>>(istream &in, pair<U, V> &p) {
  return in >> p.first >> p.second;
}
template <typename T>
ostream &operator<<(ostream &out, const vector<T> &v) {
  auto it = v.begin();
  if (!v.empty()) out << *it++;
  while (it != v.end()) out << " " << *it++;
  return out;
}
template <typename U, typename V>
ostream &operator<<(ostream &out, const pair<U, V> &p) {
  return out << p.first << " " << p.second;
}
template <class T, class F>
void map_vec(vector<T> &v, F f) {
  for (auto &i : v) {
    i = f(i);
  }
}
template <class T, class U, class F>
U reduce(const vector<T> &v, U init, F f) {
  U res = init;
  for (auto &i : v) {
    res = f(res, i);
  }
  return res;
}
vpi v;
void make_one(int a, int b) {
  vector<int> ch(b + 1);
  for (int i = 1; a + i < b + 1; i *= 2) {
    ch.assign(b + 1, 0);
    for (int j = a; j <= b; j++) {
      if (ch[j]) continue;
      ch[j] = 1;
      ch[j + i] = 1;
      v.emplace_back(j, j + i);
    }
  }
}
int main() {
  int n;
  cin >> n;
  int a = 1;
  while (a < n) {
    a *= 2;
  }
  a /= 2;
  make_one(1, a);
  make_one(n - a + 1, n);
  cout << v.size() << "\n";
  for (auto i : v) {
    cout << i << "\n";
  }
}
