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
60
61
62
63
64
65
66
#include <cmath>
#include <iostream>
#include <algorithm>
#include <iostream>
#include <map>
#include <utility>
#include <vector>

using namespace std;
using Koncowki = map< int, int >;
using Graf = vector< pair< int, int > >;
const int max_k = 1'000'000'000;

auto przygotuj(int const k) {
	Graf g(300, {-1, -1});
	Koncowki km;

	// glowa grafu
	g[1] = {2, 3};
	g[2] = {3, 4};
	int w = 2;
	int moc = 1;

	while( moc <= k ) {
		g[ w+0 ] = { w+2, w+4 };
		g[ w+2 ] = { w+3, -1 };
		g[ w+1 ] = { w+3, w+4 };
		km[moc] = w+2;

		w += 3;
		moc *= 2LL;
	}

	g[w+2] = { -1, -1 };
	g.resize(w+3);

	return make_tuple(g, km);
}

void rozwiaz(int k, Graf& g, Koncowki& km) {
	int dzielnik = pow(2, 29);
	int ostatni = g.size() - 1;
	while(dzielnik) {
		int podzial = k / dzielnik;
		if(podzial) {
			g[ km[dzielnik] ].second = ostatni;
			k %= dzielnik;
		}
		dzielnik /= 2;
	}
}

void drukuj(Graf const& g) {
	cout << (g.size() - 1) << "\n";
	for(int i = 1; i < g.size(); ++i ) {
		cout << g[i].first << " " << g[i].second << "\n";
	}
}

int main()
{
	int k; cin >> k;
	auto [g, km] = przygotuj(k);
	rozwiaz(k, g, km);
	drukuj(g);
}