Недавно столкнулся с такой задачей: Задано количество неповторяющихся символов латинского алфавита и номер перестановки. Нужно вывести эту перестановку или сказать что такая не существует. Напримет если задано 3 2 Это значит, что используем символы [a,b,c] и нужна вторая перестановка(лексикографическая). Здесь ответ будет: acb Если же например 3 12 то ответа нет, так как 12>3! Вопрос в том как быстро генерировать эту перестановку, намного быстрее чем за N! ?
Примерно так: давай будем строить перестановку от начала.
Переберём 1 элемент и для каждого посчитаем номер самого маленького с его участием(для n=5 это будут 12345, 21345, 31245, 41235, 51234). Понятно, что первый элемент будет такой же, как и у минимального большего или равного K. Теперь, зная первую цифру, попытаемся строить дальше.
Можно не перебирать кандидатов, а сразу их считать, простой формулой через деление, тогда будет линия вместо квадрата.