| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| struct Instr { |
| bool isHalt; |
| int a = 1, b = 1, x = 1, y = 1; |
| }; |
|
|
| int main() { |
| ios::sync_with_stdio(false); |
| cin.tie(nullptr); |
|
|
| long long k; |
| cin >> k; |
|
|
| const int MARK = 1024; |
| const int DUMMY_A = 1023; |
|
|
| vector<Instr> inst; |
|
|
| if (k == 1) { |
| inst.push_back(Instr{true, 1, 1, 1, 1}); |
| cout << inst.size() << "\n"; |
| cout << "HALT PUSH 1 GOTO 1\n"; |
| return 0; |
| } |
|
|
| long long m = k - 1; |
| vector<int> bits; |
| for (int p = 1; p <= 60; p++) { |
| if ((m >> p) & 1LL) bits.push_back(p); |
| } |
| sort(bits.rbegin(), bits.rend()); |
|
|
| for (int p : bits) { |
| int nDigits = p - 1; |
| int base = (int)inst.size() + 1; |
| int d1 = base + 1; |
| int popMarkerIdx = base + nDigits + 1; |
| int nextIdx = base + nDigits + 2; |
|
|
| |
| Instr call; |
| call.isHalt = false; |
| call.a = DUMMY_A; |
| call.x = base; |
| call.b = MARK; |
| call.y = (nDigits > 0) ? d1 : popMarkerIdx; |
| inst.push_back(call); |
|
|
| |
| for (int i = 1; i <= nDigits; i++) { |
| int idx = base + i; |
| Instr di; |
| di.isHalt = false; |
| di.a = i; |
| di.b = i; |
| di.x = (i < nDigits) ? (idx + 1) : popMarkerIdx; |
| di.y = d1; |
| inst.push_back(di); |
| } |
|
|
| |
| Instr popM; |
| popM.isHalt = false; |
| popM.a = MARK; |
| popM.b = 1; |
| popM.x = nextIdx; |
| popM.y = nextIdx; |
| inst.push_back(popM); |
| } |
|
|
| int haltIdx = (int)inst.size() + 1; |
| inst.push_back(Instr{true, 1, 1, 1, haltIdx}); |
|
|
| cout << inst.size() << "\n"; |
| for (int i = 1; i <= (int)inst.size(); i++) { |
| const auto &in = inst[i - 1]; |
| if (in.isHalt) { |
| cout << "HALT PUSH " << in.b << " GOTO " << in.y << "\n"; |
| } else { |
| cout << "POP " << in.a << " GOTO " << in.x << " PUSH " << in.b << " GOTO " << in.y << "\n"; |
| } |
| } |
| return 0; |
| } |