begin
var N, A, B, C, D: integer;
Readln(N, A, B, C, D);
if A > C then (A, B, C, D) := (C, D, B, A);
var s := 1.To(A - 1);
if B < C then // ( ) [ ]
s := s + B.Downto(A) + (B + 1).To(C - 1) +
D.Downto(C) + (D + 1).To(N)
else
if D < B then // ( [ ] )
begin
s := s + SeqGen(C - A, t -> B - t) +
SeqGen(D - C + 1, t -> t + A + B - D) +
SeqGen(B - D, t -> A - t + B - D - 1) + (B + 1).To(N)
end
else // ( [ ) ]
begin
s := s + SeqGen(C - A, t -> B - t) +
SeqGen(D - B, t -> D - t) + SeqGen(B - C + 1, t -> A + t) +
(D + 1).To(N);
end;
s.Println;
end.
Поделитесь своими знаниями, ответьте на вопрос:
Які адреси комірок записані правильно?: 1) А22) АВ3) А-24) 2А5) АВ4
Каким бы длинным решение не казалось - это не так, оно очень короткое, просто очень подробно расписано во всех деталях. Итак, что нам известно:
Команда 1: +1Команда 2: *2Начальное: 2Конечное: 34Проходит через: 10Не проходит через: 28Траектория вычислений должна содержать число 10. Узнаем сколько таких есть различных путей:
2 +1 +1 +1 +1 +1 +1 +1 +1 = 102 *2 +1 +1 +1 +1 +1 +1 = 10(2 +1) *2 +1 +1 +1 +1 = 10(2 +1 +1) *2 +1 +1 = 10(2 *2) *2 +1 +1 = 10(2 +1 +1 +1) *2 = 10(2 *2 +1) *2 = 10Как мы видим - 7. Так как мы узнали все возможные пути до 10, узнаем теперь пути от 10 до 34. Чтобы они не проходили через число 28, нам нужно "перескочить" его, то есть какое-то число, меньшее 28, мы должны умножить на 2 и получить какое-то число, большее 28. Получаем такое неравенство: 10≤x<28 и 28<2x≤34
(10≤x<28 и 28<2x≤34) => (10≤x<28 и 14<x≤17) => (14<x≤17).
Подыщем такие значения:
10 +1 +1 +1 +1 +1 = 1510 +1 +1 +1 +1 +1 +1 = 1610 +1 +1 +1 +1 +1 +1 +1 = 17Как мы видим - их 3. Дальше рассмотрим каждый:
15 *2 +1 +1 +1 +1 = 3416 *2 +1 +1 = 3417 * 2 = 34Выходит для каждого только 1 вариант ("15+1", "15+1+1", "16+1" будет иметь такой же путь, как и просто 16 и 17, поэтому их не рассматриваем).
Получается 7 путей от 2 до 10 и 3 пути от 10 до 34. Итого: 7*3 = 21.