Решение. Искомое количество программ равно количеству программ, получающих из числа 2 число 15. Траектория вычислений не должна содержать число 14 и должна содержать число 10.
Пусть R(n) — количество программ, которые число 1 преобразуют в число n.
Верны следующие соотношения.
1. R(n) = R(n – 1) + R(n – 2) + R(n : 3) — если n делится на три, при n > 2.
2. R(n) = R(n – 1) + R(n – 2) — если n не делится на три, при n > 2.
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) не учитываем, поскольку траектория должна содержать число 10);
R(12) = R(11) + R(10) = 80 (R(4) не учитываем, поскольку траектория должна содержать число 10);
R(13) = R(12) + R(11) = 120;
R(15) = R(13) = 120 (R(14) и R(5) не учитываем, поскольку траектория должна содержать число 10 и не должна содержать число 14).
Таким образом, количество программ, удовлетворяющих условию задачи, равно 120.
Ответ: 120.
Приведем другое решение.
Количество программ, преобразующих число 2 в число 15 таким образом, чтобы траектория вычислений содержала число 10, равно произведению количества программ, преобразующих число 2 в число 10, и количества программ, преобразующих число 10 в число 15.
Найдем количество программ, преобразующих число 2 в число 10:
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.
Найдем количество программ, преобразующих число 10 в число 15, при этом по условию траектория вычислений не должна содержать число 14. Следовательно, существует только три такие программы: 1112, 122, 212.
Тогда количество программ, преобразующих число 2 в число 15 так, чтобы траектория вычислений содержала число 10 и не содержала число 14, равно 40 · 3 = 120.
Приведём решение на языке 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))