Исполнитель А16 преобразует число, записанное на экране.
У исполнителя есть три команды, которым присвоены номера.
1. Прибавить 1.
2. Прибавить 2.
3. Умножить на 2.
Первая из них увеличивает число на экране
Программа для исполнителя А16 — это последовательность команд.
Сколько существует таких программ, которые исходное
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы 132 при исходном
Искомое количество программ равно произведению количества программ, получающих
Пусть R(n) — количество программ, которые
Для всех
1. Если n не делится
2. Если n делится
Последовательно вычислим значения R(n):
R(3) = 1;
R(4) = R(3) = 1;
R(5) = R(4) + R(3) = 1 + 1 = 2;
R(6) = R(5) + R(4) + R(3) = 2 + 1 + 1 = 4;
R(7) = R(6) + R(5) = 4 + 2 = 6;
R(8) = R(7) + R(6) + R(4) = 6 + 4 + 1 = 11;
R(9) = R(8) + R(7) = 11 + 6 = 17;
R(10) = R(9) + R(8) + R(5) = 17 + 11 + 2 = 30.
Теперь вычислим значения P(n):
P(10) = 1;
P(11) = P(10) = 1;
P(12) = P(11) + P(10) = 2.
Таким образом, количество программ, удовлетворяющих условию задачи, равно 30 · 2 = 60.
Ответ: 60.
Приведём решение на языке PascalABC.
var a:array [-5..12] of integer;
i:integer;
begin
for i:=3 to 10 do begin
a[1]:=1;
if i mod 2 =0 then a[i]:=a[i-1]+a[i-2]+a[i div 2];
if i mod 2 =1 then a[i]:=a[i-1]+a[i-2];
end;
for i:=1 to 9 do
a[i]:=0;
for i:=11 to 12 do begin
if i mod 2 =0 then a[i]:=a[i-1]+a[i-2]+a[i div 2];
if i mod 2 =1 then a[i]:=a[i-1]+a[i-2];
end;
println(a[12])
end.
Приведём решение Павла Шостка на языке PascalABC.
function f(a,b:integer):integer:=
a>b?0:a=b?1:f(a+1,b)+f(a+2,b)+f(a*2,b);
print(f(3,10)*f(10,12));
Приведём другое решение на языке 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 * 2, y)
print(f(3, 10) * f(10, 12))
О том, как решали бы эту задачу работающие программисты,
рассказал Роман Воронов в ТикТоке: https://www.tiktok.com/@_rioran_/video/7529910748902968577

