задача на количество пилообразных последовательностей
Не получается решить задачу(.
ссылка на задачу : https://informatics.msk.ru/mod/statements/view.php?chapterid=3001#1
Пилообразные последовательности
Назовем последовательность пилообразной, если каждый ее элемент либо строго больше, либо строго меньше своих соседей. По данными числам n и k определите число пилообразных последовательностей длины n, составленных из чисел 1..k.
Входные данные Программа получает на вход два натуральных числа n и k, не превосходящих 10^6. Гарантируется, что ответ не превосходит 2^31-1.
Выходные данные Выведите ответ на задачу.
Примеры входные данные
3 3
выходные данные
10
Ответы (2 шт):
Представим, что для некой длины M мы имеем:
- массив
UPдлинойk+1, ячейкаUP[k]которого содержит количество пилообразных последовательностей длинойM, заканчивающихся числомk, а перед этим было меньшее число (отсюда название. Понятно, чтоUP[1] = 0) - а также массив
DOWNтой же длины, ячейкаDOWN[k]которого содержат количество пилообразных последовательностей длинойM, заканчивающихся числомk, а перед этим было большее число (ясно, чтоDOWN[k] = 0)
Например, для M=3, k=3 UP[2] = 2 - это [2,1,2] и [3,1,2], но сами последовательности мы не генерируем
Заполняем массивы шаг за шагом (понадобится четыре массива - для текущего и для следующего шага). Значение в ячейке нового массива UP - это сумма некой части старого массива DOWN и наоборот.
В конце, после N-го шага, суммируем все ячейки обоих массивов.
Для 100,100 считается доли секунды, ответ
3773018431531573052522230433297637206758217297263096271159156235247115149777810286853214926143448593916049821132944802103999840915098829452130589430766903146390723369894978956835816, так что для ограничения результата 32-битным числом проблем со временем не будет.
Стоит посмотреть, не подчиняются ли значения какой-то закономерности. Вдруг формула простая получится...
n, k = map(int, input().split())
down, up = list(range(k - 1, -1, -1)), list(range(k))
for i in range(3, n + 1):
down, up = ([sum(up[j + 1:]) for j in range(k)],
[sum(down[:j]) for j in range(k)])
print(sum(up) + sum(down))