#include #include #include #include //#include using std::vector; vector optimal_sequence(int n) { vector sequence; int stepsCount[n]; // the path int array indicates the next step to reduce it: // 1: minus 1 // 2: divide by 2 // 3: divide by 3 int path[n]; int div2Steps, div3Steps, minus1Steps; for (int i = 1; i < n; i++) { int j = i + 1; div2Steps = INT_MAX; div3Steps = INT_MAX; if (j % 3 == 0) { div3Steps = stepsCount[j / 3 - 1]; } if (j % 2 == 0) { div2Steps = stepsCount[j / 2 - 1]; } minus1Steps = stepsCount[i - 1]; int minStepsCount = std::min(minus1Steps, std::min(div2Steps, div3Steps)); stepsCount[i] = minStepsCount + 1; if (minStepsCount == minus1Steps) { path[i] = 1; continue; } if (minStepsCount == div2Steps) { path[i] = 2; continue; } if (minStepsCount == div3Steps) { path[i] = 3; } } sequence.push_back(n); while (n > 1) { int i = path[n - 1]; if (i == 3) { n = n / 3; sequence.push_back(n); continue; } if (i == 2) { n = n / 2; sequence.push_back(n); continue; } n = n - 1; sequence.push_back(n); } reverse(sequence.begin(), sequence.end()); return sequence; } //TEST(PrimitiveCalc, Calc1) { // ASSERT_EQ(2, optimal_sequence(6).size() - 1); //} // //TEST(PrimitiveCalc, Calc2) { // ASSERT_EQ(14, optimal_sequence(96234).size() - 1); //} int main() { int n; std::cin >> n; vector sequence = optimal_sequence(n); std::cout << sequence.size() - 1 << std::endl; for (size_t i = 0; i < sequence.size(); ++i) { std::cout << sequence[i] << " "; } }