Гондола#7763

Гондола

1 секунда
128 мегабайтів
Складна

Гондола Мао-Конга — популярна пам'ятка Тайбея. Це канатна дорога у формі кола з однією станцією та гондолами, пронумерованими від до . Гондоли рухаються в одному напрямку. Спочатку, після гондоли з номером повз станцію проїжджає гондола з номером ( + ) для < . Якщо = , то наступною проїжджає гондола з номером .

Іноді гондоли можуть виходити з ладу. На щастя, у нас є необмежена кількість запасних гондол, які мають номери ( + ), ( + ) і так далі. Коли гондола ламається, її замінюють запасною з найменшим номером серед тих, які ще не були використані. Нова гондола встановлюється на те ж місце, де стояла зламана. Наприклад, якщо було п'ять гондол, і одна з них зламалася, то її замінять на гондолу з номером .

Вам подобається стояти на станції і спостерігати за гондолами, що проїжджають повз. Послідовністю гондол називається послідовність з номерів гондол у порядку, в якому вони проїжджають повз станцію. Можливо, що одна або кілька гондол зламалися до того, як ви прийшли на станцію, але поки ви дивитеся на рух гондол, жодна з них не ламається.

Зверніть увагу, що одному й тому ж порядку гондол може відповідати кілька послідовностей, залежно від того, яка з гондол приїхала на станцію першою. Наприклад, якщо жодна з гондол не ламалася, то можливі послідовності гондол (, , , , ) і (, , , , ), а (, , , , ) — не є послідовністю гондол, тому що гондоли приїхали в неправильному порядку.

Якщо гондола з номером зламається, то ви зможете побачити послідовність гондол (, , , , ). Якщо після цього зламається гондола з номером , її замінять на гондолу з номером , і ви зможете побачити послідовність (, , , , ). Якщо після цього гондола з номером зламається, її замінять на гондолу з номером , і ви зможете побачити послідовність (, , , , ).

prb7763.gif

Послідовністю замін називається послідовність номерів зламаних гондол у тому порядку, в якому вони ламалися. У попередньому прикладі послідовність замін — (, , ). Вважатимемо, що послідовність замін породжує послідовність гондол , якщо після того, як гондоли ламалися і замінювалися відповідно до послідовності замін , ви можете побачити послідовність гондол .

Перевірка послідовності гондол

У перших трьох підзадачах вам необхідно перевірити, чи є послідовність гондол коректною. Вам потрібно реалізувати функцію valid(, inputSeq), де

Підзадачі 1, 2, 3

prb7763_1.gif

Приклади

У таблиці нижче наведені приклади послідовностей, які є і не є послідовностями гондол.

prb7763_2.gif

Послідовність замін

У наступних трьох підзадачах ви повинні побудувати послідовність замін, яка породжує задану послідовність гондол. Ви можете побудувати будь-яку з таких послідовностей.

Вам потрібно реалізувати функцію replacement(, gondolaSeq, replacementSeq), де

Підзадача 4, 5, 6

prb7763_3.gif

Приклади

prb7763_4.gif

Підрахунок послідовностей замін

У наступних чотирьох підзадачах ви повинні визначити кількість послідовностей замін, які породжують задану послідовність (яка може бути послідовністю гондол, а може не бути) за модулем 10^9 + . Ви повинні реалізувати функцію countReplacement(, inputSeq).

Підзадачі 7, 8, 9, 10

prb7763_5.gif

Приклади

prb7763_6.gif

Вхідні дані

Перший рядок містить номер підзадачі , яку повинна вирішувати ваша програма (1 \leq t \leq 10);

Другий рядок містить довжину переданої послідовності;

Якщо дорівнює , або , то третій рядок містить gondolaSeq[0], ..., gondolaSeq[n-1]. Інакше він містить inputSeq[0], ..., inputSeq[n-1].

Вихідні дані

Для кожного питання буде виведено відповідну відповідь.

Приклади

Приклад 1

Loading
Loading

Приклад 2

Loading
Loading

Приклад 3

Loading
Loading

Приклад 4

Loading
Loading

Приклад 5

Loading
Loading

Приклад 6

Loading
Loading

Приклад 7

Loading
Loading

Приклад 8

Loading
Loading

Приклад 9

Loading
Loading

Приклад 10

Loading
Loading