Прежде всего, обратите внимание, что эта проблема легко может быть преобразована в просто перестановки ранжирования / листинга. Все, что вам нужно сделать, это написать функцию, которая принимает перестановку 1..(n-1)
и преобразует ее в перестановку, соответствующую вашим условиям, и наоборот. (Идя в одну сторону, просто увеличьте каждое число в перестановке, которое больше k
, и вставьте k
в i
-ю позицию. Переходя в другое, удалите k
и уменьшите все, что больше k
.)
Но рейтинг / листинг - это хорошо понятная проблема. См. https://rosettacode.org/wiki/Permutations/Rank_of_a_permutation для решений на нескольких языках, включая три в Python.
Эта идея может быть расширена до большего числа условий, таких как первый. Вам просто нужно сначала написать более общие преобразования.