| #include <bits/stdc++.h> |
| using namespace std; |
|
|
| struct Instr { |
| bool isPop; |
| int a, b, x, y; |
| }; |
|
|
| int main() { |
| ios::sync_with_stdio(false); |
| cin.tie(nullptr); |
| |
| long long k; |
| if (!(cin >> k)) return 0; |
| long long K = k + 1; |
|
|
| |
| vector<int> base_m; |
| for (int i = 1; i <= 31; ++i) { |
| if ((K >> i) & 1LL) base_m.push_back(i); |
| } |
| int s = (int)base_m.size(); |
|
|
| |
| vector<int> mlist = base_m; |
| for (int i = 0; i < s - 1; ++i) mlist.push_back(2); |
|
|
| |
| vector<int> coded; |
| for (int m : mlist) if (m >= 2) coded.push_back(m); |
|
|
| int C = (int)coded.size(); |
| vector<int> start(C); |
| int sum_d = 0; |
| for (int i = 0; i < C; ++i) { |
| start[i] = sum_d + 1; |
| sum_d += coded[i] - 1; |
| } |
| int haltIndex = sum_d + 1; |
|
|
| vector<Instr> insns(haltIndex); |
|
|
| if (C == 0) { |
| |
| insns[0].isPop = false; |
| insns[0].b = 1; |
| insns[0].y = 1; |
| } else { |
| |
| for (int bi = 0; bi < C; ++bi) { |
| int m = coded[bi]; |
| int d = m - 1; |
| int sidx = start[bi]; |
|
|
| for (int i = 1; i <= d; ++i) { |
| int g = sidx + (i - 1); |
| insns[g - 1].isPop = true; |
| insns[g - 1].a = i; |
| insns[g - 1].b = i; |
| insns[g - 1].y = sidx; |
| if (i < d) { |
| insns[g - 1].x = sidx + i; |
| } else { |
| |
| insns[g - 1].x = (bi + 1 < C) ? start[bi + 1] : haltIndex; |
| } |
| } |
| } |
| |
| insns[haltIndex - 1].isPop = false; |
| insns[haltIndex - 1].b = 1; |
| insns[haltIndex - 1].y = start.back(); |
| } |
|
|
| cout << insns.size() << '\n'; |
| for (size_t i = 0; i < insns.size(); ++i) { |
| if (insns[i].isPop) { |
| cout << "POP " << insns[i].a << " GOTO " << insns[i].x |
| << " PUSH " << insns[i].b << " GOTO " << insns[i].y << '\n'; |
| } else { |
| cout << "HALT PUSH " << insns[i].b << " GOTO " << insns[i].y << '\n'; |
| } |
| } |
| return 0; |
| } |