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
#include <vector>
#include <cstdio>

using namespace std;

vector<vector<int>> ed(111, vector<int>());

void add(int a, int b) {
  ed[a].push_back(b);
}

int main(int argc, char** argv) {
  int k;
  scanf("%d",&k);

  int z = 31-__builtin_clz(k);
  int n = 3*z + 2;
  int prev = 0;
  for(int i=0;i<z;i++) {
    int u = prev+1;
    int v = prev+2;
    int dest = prev+3;
    add(prev, u);
    add(prev, v);
    add(u, dest);
    add(v, dest);
    prev = dest;
  }
  add(prev, prev+1);
  int last = prev+1;
  for(int i=0;i<z;i++) {
    if(((1<<i)&k)>0) {
      add(1+3*i, last);
    }
  }

  printf("%d\n", n);
  for(int i=0;i<n;i++) {
    vector<int>& v = ed[i];
    for(int j=0;j<2;j++) {
      if(j > 0) {
        printf(" ");
      }
      if(j < v.size()) {
        printf("%d", v[j]+1);
      } else {
        printf("-1");
      }
    }
    printf("\n");
  }
  return 0;
}