Исполнитель преобразует число на экране. У исполнителя есть три команды, которым присвоены номера:
1. Прибавить 1.
2. Прибавить 2.
3. Умножить на 3.
Первая команда увеличивает число на экране
Программа для исполнителя — это последовательность команд. Сколько существует программ, которые преобразуют исходное
Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 213 при исходном
Искомое количество программ равно количеству программ, получающих
Пусть R(n) — количество программ, которые
Верны следующие соотношения.
1. R(n) = R(n – 1) + R(n – 2) + R(n : 3) — если n делится на три, при
2. R(n) = R(n – 1) + R(n – 2) — если n не делится на три, при
R(2) = 1;
R(3) = R(2) = 1;
R(4) = R(2) + R(3) = 2;
R(5) = R(4) + R(3) = 3;
R(6) = R(5) + R(4) + R(2) = 6;
R(7) = R(6) + R(5) = 9;
R(8) = R(7) + R(6) = 15;
R(9) = R(8) + R(7) + R(3) = 25;
R(10) = R(9) + R(8) = 40;
R(11) = R(10) = 40 (R(9) не учитываем, поскольку траектория должна содержать
R(12) = R(11) + R(10) = 80 (R(4) не учитываем, поскольку траектория должна содержать
R(13) = R(12) + R(11) = 120;
R(15) = R(13) = 120 (R(14) и R(5) не учитываем, поскольку траектория должна содержать
Таким образом, количество программ, удовлетворяющих условию задачи,
Ответ: 120.
Приведем другое решение.
Количество программ, преобразующих
Найдем количество программ, преобразующих
R(2) = 1;
R(3) = R(2) = 1;
R(4) = R(2) + R(3) = 2;
R(5) = R(4) + R(3) = 3;
R(6) = R(5) + R(4) + R(2) = 6;
R(7) = R(6) + R(5) = 9;
R(8) = R(7) + R(6) = 15;
R(9) = R(8) + R(7) + R(3) = 25;
R(10) = R(9) + R(8) = 40.
Найдем количество программ, преобразующих
Тогда количество программ, преобразующих число 2 в число 15 так, чтобы траектория вычислений содержала
Приведём решение на языке PascalABC.
var a:array[-10..15] of integer;
i:integer;
begin
if i < 2 then a[i]:=0;
a[2]:=1;
for i:=3 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:=-10 to 9 do
a[i]:=0;
for i:=11 to 15 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];
a[14]:=0
end;
println(a[15])
end.
Приведём другое решение на языке Python.
def f(x, y):
if x > y or x == 14:
return 0
if x == y:
return 1
else:
return f(x + 1, y) + f(x + 2, y) + f(x * 3, y)
print(f(2, 10) * f(10, 15))

