Исполнитель М17 преобразует число, записанное на экране. У исполнителя есть три команды, которым присвоены номера:
1. Прибавить 1.
2. Прибавить 2.
3. Умножить на 3.
Первая из них увеличивает число на экране
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 132 при исходном
Искомое количество программ равно произведению количества программ, получающих
Будем решать задачу с конца. Число 12 из числа 10 можно получить двумя способами (10 + 1 + 1; 10 + 2).
R(2) = 1;
R(3) = R(2) = 1;
R(4) = R(3) + R(2) = 2;
R(5) = R(4) + R(3) = 2 + 1 = 3;
R(6) = R(5) + R(4) + R(2) = 3 + 2 + 1 = 6;
R(7) = R(6) + R(5) = 6 + 3 = 9;
R(8) = R(7) + R(6) = 9 + 6 = 15.
Таким образом, количество программ, удовлетворяющих условию задачи, равно R(2) · R(8) · R(10) · R(12) = 1 · 15 · 2 · 2 = 60.
Ответ: 60.
Приведём решение на языке PascalABC.
var a: array[-10..12] of integer;
i:integer;
begin
for i:=2 to 8 do begin
a[2]:=1;
if i mod 3 = 0 then a[i]:=a[i-1]+a[i-2]+a[i div 3];
if i mod 3 <> 0 then a[i]:=a[i-1]+a[i-2];
end;
for i:=2 to 7 do
a[i]:=0;
for i:=9 to 10 do begin
if i mod 3 = 0 then a[i]:=a[i-1]+a[i-2]+a[i div 3];
if i mod 3 <> 0 then a[i]:=a[i-1]+a[i-2];
end;
for i:=7 to 9 do
a[i]:=0;
for i:=11 to 12 do begin
if i mod 3 = 0 then a[i]:=a[i-1]+a[i-2]+a[i div 3];
if i mod 3 <> 0 then a[i]:=a[i-1]+a[i-2];
end;
println(a[12]);
end.
Приведём решение Сергея Никифорова на языке Python.
def f(x, y):
if x > y:
return 0
if x == y:
return 1
else:
return f(x + 1, y) + f(x + 2, y) + f(x * 3, y)
print(f(2, 8) * f(8, 10) * f(10, 12))

