Изменения
Нет описания правки
 '''for'''  i = 1  '''to'''  n  '''do'''                      
   '''for'''  j = 1  '''to'''  k  '''do'''                      
     '''if'''  элемент j можно поставить на i-e место'''{'''       '''then if''' numOfObject > (количество комбинаторных обектов с данным префиксом)'''              '{''then'''            numOfObject -= (количество комбинаторных обектов с данным префиксом)                   '''} else{'''              '''then'''            ans[i]=j                                      break       '''}'''     '''}'''
Несложно понять, что корректность алгоритма следует из его построения.
Сложность алгоритма <tex>O(nkf(1..i)) </tex>, где <tex>f(1..i)</tex> - сложность вычисления количества комбинаторных объектов с данным префиксом. Основную сложность при построении алгоритмов генерации комбинаторных объектов составляет вычисление количества комбинаторных объектов с данным префиксом. Приведем примеры способов получения некоторых из [[Комбинаторные объекты|комбинаторных объектов]] по номеру.
*мы должны поставить ту цифру, которая еще полностью не занята, то есть <tex>alreadyWas+1</tex> - ую, которой еще нет в нашем префиксе, считаем, что это цифра <tex>j</tex>
 '''for'''  i = 1  '''to'''  n  '''do''' '''{'''                               
   alreadyWas = (numOfPermutation-1) div <tex>P_{n-i} </tex>      
   numOfPermutation = ((numOfPermutation-1) mod <tex>P_{n-i} </tex>) + 1  
   ans[i] = j (посчитаем за <tex>O(n) </tex>)
   теперь j-ый элемент занят (находится в нашем префиксе)
 '''}'''
Данный алгоритм работает за <tex>O(n^2) </tex> (n=k). Мы можем посчитать все <tex>P_{n} </tex> за <tex>O(n) </tex>. Асимптотику можно улучшить 
до <tex>O(n \log {n}) </tex>, если использовать структуры данных, которые позволяют искать i-ый элемент множества и удалять элемент 
