gen(p):
if (p = комбинаторный объект):
print(p)
for (C in ∑): (перебор в возрастающем порядке):
if (p + [C] - префикс комбинаторного объекта):
gen(p+[C])
a = <...>
used = <...> - взятые элементы
gen(p): p - длина префикса
if p == n:
print(a)
return
for i = 1 .. n:
if !used[i]
used[i] = true
a[p] = i
gen(p+1)
used[i] = false
gen(p):
if p == n:
if k == 0:
print(a)
k--
return
for i = 1 .. n:
if !used[i]:
if k ≥ (n-p-1)!:
k -= (n-p-1)!
else:
used[i] = true
a[p] = i
gen(p+1)
return
gen(p):
if (p = комбинаторный объект):
print(p)
for (C in ∑): (перебор в возрастающем порядке):
if (p + [C] - префикс комбинаторного объекта):
t = кол-во комбинаторных объектов с префиксом p+[c]
if k ≥ t:
k -= t
else gen(p+[c]):
return
Если фиксированно (например ), то мы можем заранее посчитать сколько пропусков нужно сделать
Тогда берём й неиспользованный элемент
перестановка по номеру за