1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
///MEMENTO MEMO, MEMENTO LONG LONG
#include <bits/stdc++.h>

#define DEBUG if(0)
#define COUT cout << "\e[36m"
#define ENDL "\e[39m" << endl
#define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] "

using namespace std;
typedef long long LL;

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int x;
    cin >> x;
    unsigned int l = 1;
    while(x >= (1<<l))
        l++;
    l--;
    int n = 2+(l)*3;
    vector<vector<int>> adj(n+1);
    DEBUG COUT << VAR(l) << VAR((1<<l)) << VAR(n) << ENDL;
    if(1&x)
    {
        assert(adj.size() > 1);
        adj[1].push_back(n);
    }
    for(int i = 1; i <= l; ++i)
    {
        for (int j = 2; j <= 3; ++j)
        {
            if(3*i-j > 0)
            {
                adj[3*i-j].push_back(3*i-1);
            }
        }
        adj[3*i-1] = {3*i, 3*i+1};
        if(x & (1<<i))
        {
            adj[3*i].push_back(n);
            adj[3*i+1].push_back(n);
        }

    }
    cout << n << "\n";

    for (int i = 1; i <= n; ++i)
    {
        while(adj[i].size() < 2)
            adj[i].push_back(-1);
        assert(adj[i].size() == 2);
        cout << adj[i][0] << " " << adj[i][1] << "\n";
    }

    return 0;
}