Розкладання перестановок#4943

Розкладання перестановок

1 секунда
64 мегабайти
Дуже складна

У цій задачі під перестановкою з елементів розуміється послідовність цілих чисел довжини , у якій кожне число від до n-1 трапляється рівно один раз. Нехай -й елемент перестановки позначається як p_i, де — індекс від до n-1. Добуток двох перестановок та з елементів — це ще одна перестановка з елементів така, що c_i = a_{b_i}. Зверніть увагу, що множення перестановок є лівоасоціативним, тобто операції виконуються зліва направо.

Серед перестановок нас цікавлять подвійні перестановки. Подвійну перестановку можна представити як об'єднання двох неперетинних зростаючих послідовностей. Наприклад, перестановка (1, 3, 4, 0, 5, 2) є подвійною, бо її можна розбити на дві зростаючі послідовності: (1, 3, 4, 5) та . Натомість перестановка (5, 1, 3, 4, 0, 2) не є подвійною перестановкою.

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

Вхідні дані

Перший рядок містить число (2 \leq n \leq 20000).

Другий рядок містить чисел, які визначають початкову перестановку.

Вихідні дані

Якщо розв'язок не можна знайти за наведеними обмеженнями, виведіть одне число .

Якщо розв'язок існує, виведіть число — кількість подвійних перестановок у знайденому розкладі, у першому рядку, а в наступних рядках виведіть самі подвійні перестановки у тому порядку, у якому вони зустрічаються у добутку.

Приклади

Приклад 1

Loading
Loading