Ctrl K

Разбиение на подъём и спуск: большие числа

Сложная
Дан массив положительных целых чисел totals длины n. Нужно разложить каждый элемент на два неотрицательных целых слагаемых: totals[i] = up[i] + down[i]. Разложение подходит, если массив up неубывающий (up[0] ≤ up[1] ≤ … ≤ up[n-1]), а массив down невозрастающий (down[0] ≥ down[1] ≥ … ≥ down[n-1]). Сколько существует подходящих разложений? Два разложения различны, если различаются их массивы up. Ответ может быть огромным — верните его по модулю 10⁹ + 7.
Пример 1
totals=[3, 1] → 3

Подходят три разбиения: up=[0, 0], down=[3, 1]; up=[0, 1], down=[3, 0]; up=[1, 1], down=[2, 0].

Пример 2
totals=[4, 4, 4] → 35

Здесь up — любая неубывающая тройка чисел от 0 до 4, а down тогда сам получается невозрастающим. Таких троек 35.

Пример 3
totals=[1, 5, 1] → 0

Из-за скачка с 1 до 5 up должен вырасти хотя бы на 4, а последний элемент up не больше 1. Разбиений нет.

Ограничения
  • 1 ≤ len(totals) ≤ 2000
  • 1 ≤ totals[i] ≤ 10³
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиРазбиение на подъём и спуск СложнаяЧестный раздел цветных бусин СложнаяДругие порядки для того же дерева поиска Сложнаяk-й маршрут по алфавиту СложнаяСлияние плиток спереди Сложная
загружаем Python…
Вход
totals=[3, 1]
Ожидается
3

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 79 тестов на сервере, включая скрытые.