#include #include #include #include #include int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); unsigned int k; std::cin >> k; if (k == 1) { std::cout << 1 << std::endl; std::cout << "HALT PUSH 1 GOTO 1" << std::endl; return 0; } unsigned int q = (k - 1) / 2; std::vector bits; if (q == 0) { // This case would be for k=1, which is handled above. // For q=0, m should be 0, but to have a bit representation, // we can consider it as a single 0 bit if needed. // However, the logic works for q > 0. } unsigned int temp_q = q; if (temp_q == 0) { // For k=3, q=1. For k=1, q=0. // A simple q=0 case might need one bit to represent it // but problem constraints k>=1 means q>=0. // if k=3, q=1, needs a bit. if k=1, q=0. // let's just make sure bits is never empty for q>0 if (q>0) { while (temp_q > 0) { bits.push_back(temp_q % 2); temp_q /= 2; } } } else { while (temp_q > 0) { bits.push_back(temp_q % 2); temp_q /= 2; } } if (bits.empty() && q > 0) { // Should not happen for q>0 // Failsafe for very large numbers int num_bits = floor(log2(q)) + 1; temp_q = q; for(int i = 0; i < num_bits; ++i) { bits.push_back(temp_q % 2); temp_q /= 2; } } std::reverse(bits.begin(), bits.end()); if (q > 0 && bits.empty()) { // e.g. q=1 bits.push_back(1); } int m = bits.size(); if (q == 0) m = 0; int n = m + 3; std::cout << n << std::endl; // Instruction 1: Entry point, pushes the first token. std::cout << "POP 1 GOTO 2 PUSH 1 GOTO 2" << std::endl; // Instructions 2 to m+1: The chain for processing bits of q. for (int i = 0; i < m; ++i) { int instr_idx = i + 2; if (bits[i] == 1) { // For a '1' bit. std::cout << "HALT PUSH 1 GOTO " << instr_idx + 1 << std::endl; } else { // For a '0' bit. std::cout << "POP 1 GOTO " << m + 2 << " PUSH 2 GOTO " << instr_idx + 1 << std::endl; } } // Instruction m+2: The "return" mechanism. std::cout << "POP 1 GOTO 2 PUSH 2 GOTO " << m + 2 << std::endl; // Instruction m+3: The final halt point. std::cout << "HALT PUSH 99 GOTO " << m + 2 << std::endl; return 0; }