#include <iostream>
#include <stack>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
int n, logN, m;
int edges1[100];
int edges2[100];
cin >> n;
stack<int> bytes;
while (n > 0) {
bytes.push(n % 2);
n /= 2;
}
logN = bytes.size() - 1;
m = logN * 3 + 2;
for (int i = 0; i < m; ++i) {
edges1[i] = i + 1;
edges2[i] = -1;
}
edges1[m - 1] = -1;
for (int i = logN + 1; i < m - 1; i += 2) {
edges2[i] = i + 2;
}
bytes.pop();
int fromV = 1;
int toV = logN + 3;
while (!bytes.empty()) {
int doSth = bytes.top();
bytes.pop();
if (doSth) {
edges2[fromV] = toV;
}
++fromV;
toV += 2;
}
cout << m << endl;
for (int i = 0; i < m; ++i) {
if (edges1[i] >= 0) {
++edges1[i];
}
if (edges2[i] >= 0) {
++edges2[i];
}
cout << edges1[i] << " " << edges2[i] << endl;
}
return 0;
}
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 | #include <iostream> #include <stack> using namespace std; int main() { ios_base::sync_with_stdio(0); int n, logN, m; int edges1[100]; int edges2[100]; cin >> n; stack<int> bytes; while (n > 0) { bytes.push(n % 2); n /= 2; } logN = bytes.size() - 1; m = logN * 3 + 2; for (int i = 0; i < m; ++i) { edges1[i] = i + 1; edges2[i] = -1; } edges1[m - 1] = -1; for (int i = logN + 1; i < m - 1; i += 2) { edges2[i] = i + 2; } bytes.pop(); int fromV = 1; int toV = logN + 3; while (!bytes.empty()) { int doSth = bytes.top(); bytes.pop(); if (doSth) { edges2[fromV] = toV; } ++fromV; toV += 2; } cout << m << endl; for (int i = 0; i < m; ++i) { if (edges1[i] >= 0) { ++edges1[i]; } if (edges2[i] >= 0) { ++edges2[i]; } cout << edges1[i] << " " << edges2[i] << endl; } return 0; } |
English