Исполнитель-вычислитель: сложная задача с простым решением О.Б. Богомолова, Д.Ю. Усенков, Москва
Задача. У исполнителя Калькулятор две команды: 1. прибавь умножь на 2. Первая из них увеличивает число на экране на 1, вторая – увеличивает его в 2 раза. Программа для Калькулятора – это последовательность команд. Сколько различных чисел можно получить из числа 2 с помощью программы, которая содержит ровно 4 команды?
Решение Построим граф – дерево, вершинами которого являются числа (причем корневая вершина – это исходное число). Ветви этого дерева соответствуют возможным каждый раз операциям (их две, поэтому от каждой вершины будет отходить ровно две ветви дерева). Количество таких ветвлений (глубина дерева) будет равно 4, так как в задаче требуется узнать, сколько чисел можно получить с помощью программы ровно из четырех команд. Ответ: 15 различных чисел
Задача. У исполнителя МинусПлюс есть две команды: 1. прибавь 4, 2. вычти 5. Первая из них увеличивает число на экране на 4, вторая – уменьшает его на 5. Программа для МинусПлюса – это последовательность команд. Сколько различных чисел можно получить из числа 100 с помощью различных программ, каждая из которых содержит ровно 7 команд?
Решение Аналогично предыдущей задаче, составляем дерево вариантов. Корневая вершина в нем соответствует исходному числу 100, от каждой вершины отходит две ветви (соответствующих двум возможным операциям), глубина дерева равна 7 (количество команд в программах) – –5+4– –5+4–5+4–5+4– Из-за большого количества команд (7) дерево получается очень громоздким. Однако нетрудно заметить, что уже в его середине появляются повторяющиеся числа. Их можно исключать уже на этапе построения дерева, «обрубая» лишние ветви и продолжая только одну ветвь из нескольких, соответствующих каждому повторяющемуся числу. Такие «обрубленные» повторяющиеся ветви мы будем обозначать двойным кружком.
Решение Ответ: 8 различных чисел
Задача. У исполнителя Множик есть две команды: 1. умножь на 4, 2. подели на 2. Первая из них увеличивает число на экране в 4 раза, вторая – уменьшает его в 2 раза. Программа для Множика – это последовательность команд. Сколько различных чисел можно получить из числа 1024 с помощью программы, которая содержит ровно 10 команд?
Решение Эта задача решается аналогично предыдущим. Однако из-за громоздкости получаемого дерева (в данном случае его глубина будет равна 10) можно использовать упрощенное графическое представление множества вариантов в виде таблицы. Ее смысл – тот же, что и у аналогичного дерева, но обозначения команд каждый раз не приводятся: подразумевается, что левое из двух получаемых значений всегда соответствует первой команде (в данном случае – умножению), а правое – второй команде (здесь – делению). Появляющиеся повторы чисел также исключаются по мере построения таблицы, при этом соседние одинаковые числа объединяются в одно число
Решение Чтобы сделать таблицу еще более компактной, в данном случае можно заменить сами числа соответствующими степенями двоек, а операции умножения на 4 и деления на 2 – соответственно, на операции прибавления 2 и вычитания
Решение Вычислить сами числа, получаемые после выполнения программы из 10 команд, можно, возводя 2 в соответствующие степени. Однако это условием задачи не требуется! Нам нужно определить только количество таких чисел, которое, очевидно, равно количеству полученных в нашей таблице показателей степени двойки: 11 чисел. Ответ: 11 чисел
Демонстрационный вариант С У исполнителя Утроитель две команды, которым присвоены номера: 1. прибавь 1, 2. умножь на 3. Первая из них увеличивает число на экране на 1, вторая – утраивает его. Программа для Утроителя – это последовательность команд. Сколько есть программ, которые число 1 преобразуют в число 29? Ответ обоснуйте.
Решение Обозначим как R(n) количество программ, которые преобразуют число 1 в число n. Для анализа решения лучше рассматривать обратный процесс – получение числа 1 из числа 29 при помощи обратных команд «вычесть 1» и «делить на 3». Тогда общая запись будет иметь вид: R(n) = R(n/3) + R(n – 1), поскольку в общем случае очередное число может быть получено или делением на 3, или вычитанием единицы. Возвращаемся к исходной задаче и начинаем поочередно вычислять количество возможных программ для получения каждого очередного возможного числа начиная с исходного значения 1 и до заданного конечного значения 29.
Решение Поскольку в любом случае исходное число имеется «в единственном экземпляре», можно сразу записать: R(1) = 1 Дальнейшие строки сразу записываются в вышеприведенном общем виде (с двумя слагаемыми), – это и есть та «механичность» решения, о которой было сказано выше. Но затем мы анализируем первое слагаемое (с операцией деления) и исключаем его из рассмотрения, если результат деления получается не целый (в нашей записи помечаем это зачеркиванием). В итоге мы для данной строки получим запись R(n), где в качестве n записано предыдущее число. Но для него мы ранее уже определили количество возможных программ, и это значение мы используем теперь в вычислениях: R(2) = R(2/3) + R(2 – 1) = R(2/3) + R(2 – 1) = R(2 – 1) = R(1) = 1.
Решение Аналогично продолжаем делать и далее по указанному выше «шаблону». Например, в записи для R(3), поскольку деление числа 3 на 3 выполняется нацело, мы получаем два слагаемых – R(1) и R(2), которые, как мы вычислили ранее, оба равны 1. Поэтому их сумма будет равна 2: R(3) = R(3/3) + R(3 – 1) = R(1) + R(2) = = 2. И так далее: R(4) = R(4/3) + R(4 – 1) = R(4/3) + R(4 – 1) = R(3) = 2. R(5) = R(5/3) + R(5 – 1) = R(5/3) + R(5 – 1) = R(4) = 2. R(6) = R(6/3) + R(6 – 1) = R(2) + R(5) = = 3. R(7) = R(7/3) + R(7 – 1) = R(7/3) + R(7 – 1) = R(6) = 3. R(8) = R(8/3) + R(8 – 1) = R(8/3) + R(8 – 1) = R(7) = 3. R(9) = R(9/3) + R(9 – 1) = R(3) + R(8) = = 5. R(10) = R(10/3) + R(10 – 1) = R(10/3) + R(10 – 1) = R(9) = 5. R(11) = R(11/3) + R(11 – 1) = R(11/3) + R(11 – 1) = R(10) = 5. R(12) = R(12/3) + R(12 – 1) = R(4) + R(11) = = 7. R(13) = R(13/3) + R(13 – 1) = R(13/3) + R(13 – 1) = R(12) = 7.
Решение R(14) = R(14/3) + R(14 – 1) = R(14/3) + R(14 – 1) = R(13) = 7. R(15) = R(15/3) + R(15 – 1) = R(5) + R(14) = = 9. R(16) = R(16/3) + R(16 – 1) = R(16/3) + R(16 – 1) = R(15) = 9. R(17) = R(17/3) + R(17 – 1) = R(17/3) + R(17 – 1) = R(16) = 9. R(18) = R(18/3) + R(18 – 1) = R(6) + R(17) = = 12. R(19) = R(19/3) + R(19 – 1) = R(19/3) + R(19 – 1) = R(18) = 12. R(20) = R(20/3) + R(20 – 1) = R(20/3) + R(20 – 1) = R(19) = 12. R(21) = R(21/3) + R(21 – 1) = R(7) + R(20) = = 15. R(22) = R(22/3) + R(22 – 1) = R(22/3) + R(22 – 1) = R(21) = 15. R(23) = R(23/3) + R(23 – 1) = R(23/3) + R(23 – 1) = R(22) = 15. R(24) = R(24/3) + R(24 – 1) = R(8) + R(23) = = 18. R(25) = R(25/3) + R(25 – 1) = R(25/3) + R(25 – 1) = R(24) = 18. R(26) = R(26/3) + R(26 – 1) = R(26/3) + R(26 – 1) = R(25) = 18. R(27) = R(27/3) + R(27 – 1) = R(9) + R(26) = = 23. R(28) = R(28/3) + R(28 – 1) = R(28/3) + R(28 – 1) = R(27) = 23. R(29) = R(29/3) + R(29 – 1) = R(29/3) + R(29 – 1) = R(28) = 23. Достигнуто конечное число, указанное в условии задачи. Последнее по счету числовое значение для этой строки – и есть ответ к задаче. Ответ: 23 программы.
Задача. У исполнителя Троитель-шестеритель две команды, которым присвоены номера: 1. прибавь 6, 2. умножь на 3. Первая из них увеличивает число на экране на 6, вторая – утраивает его. Программа для исполнителя – это последовательность команд. Сколько есть программ, которые число 9 преобразуют в число 87? Ответ обоснуйте.
Указание к решению Аналогично предыдущей задаче, будем расписывать строки R(n) начиная с исходного числа 9 и до последнего – 87. Но поскольку в команде суммирования предполагается прибавление не 1, а 6, нужно записывать значения R(n) для n с шагом 6. Само исходное число, как и раньше, имеется «в единственном экземпляре», поэтому: R(9) = 1. Но следующее значение R(n) мы берем не для n = 10, а для n = = = 15. Действительно, если, например, взять n = 10, то : R(10) = R(10/3) + R(10 – 6) = R(4). Но поскольку вычисления начинаются с числа 9, значение R(4) не существует, и данная запись бессмысленна. Аналогично, несуществующие значения R(n) получаются и в других случаях при попытке записи строк для n с шагом, отличающимся от 6.
Указание к решению Поэтому следующая строка должна записываться для R(15); при этом, как и в предыдущей задаче, слагаемые, дающие нецелый результат, из рассмотрения исключаются, а для получаемых в качестве слагаемых значений R(n) берутся ранее вычисленные значения. Кроме того, если значение R(n) не существует, то оно тоже исключается из рассмотрения: R(15) = R(15/3) + R(15 – 6) = R(5) + R(9) = R(9) = 1. И так далее до R(87). Ответ: 6 программ.
Задача. У исполнителя Квадратик две команды, которым присвоены номера: 1. прибавь 2, 2. возведи в квадрат. Первая из них увеличивает число на экране на 2, вторая – возводит в квадрат. Программа для исполнителя – это последовательность команд. Сколько есть программ, которые число 4 преобразуют в число 66? Ответ обоснуйте.
Указание к решению Для решения этой задачи надо действовать аналогично предыдущим задачам. Но здесь «обратными» операциями по отношению к командам исполнителя будут вычитание пятерки и вычисление корня квадратного. Кроме того, поскольку в исходной задаче прибавляется число 2, нужно записывать такие строки начиная с исходного числа 4 и с шагом 2. Само исходное число имеется «в единственном экземпляре»: R(4) = 1. Следующую строку записываем для n = = 6. При этом, как и раньше, на каждом шаге увеличиваем значение n на 2, слагаемые, в которых квадратный корень извлекается не нацело, отбрасываем (равно как и получаемые несуществующие значения R(n) ), а для остающихся слагаемых берем ранее вычисленные соответствующие числовые значения: R(6) = R( ) + R(6 – 2) = R( ) + R(4) = R(4) = 1. И так далее