# ADS úlohy E - prank
Permutaci čísel zde budu označovat jako řetězec.
Je-li na posledních $p$ pozicích řetězce rostoucí posloupnost, pak prvek těsně před touto posloupností se změní až v $p!$-té následující permutaci. Aby se totiž na pozicích od $n-p$ do $n-1$ (indexuji od nuly) změnila posloupnost na klesající, budou se muset vystřídat všechny permutace na těchto pozicích - od lexikograficky první do lexikograficky poslední.
Jak toto pomůže při sestavování dané permutace? Příklad (pořadí, řetězec):
$0: 123$
$1: 132$
$2: 213$
$3: 231$
$4: 312$
$5: 321$
Zaměřím se na permutaci 3:
Začínám-li dvojkou, pak to signalizuje, že se muselo na zbývajících pozicích protočit $1*2!$ permutací. Proč: $"1"$ znamená, že dvojka se nachází o $1$ pozici za jedničkou, a $2!$ znamená, že prvky na zbývajících dvou pozicích tvoří $2!$ permutací.
Trojka na druhé pozici znamená protočení $1*1!$ permutací - trojka je nyní o jeden krok za jedničkou, jelikož dvojku už jsem použil. To vede na následující myšlenku:
Představím si, že mám řetězec $123$ a z něj postupně odebírám prvky, abych dostal příslušnou permutaci. Pak indexy, které ukazují na pozice odebíraných prvků, budou následující:
$0: 000$
$1: 010$
$2: 100$
$3: 110$
$4: 200$
$5: 210$
což jsou příslušné násobky faktoriálů - např. $3=1*2!+1*1!+0*0!$.
Toto mi pomůže zjistit, jak z permutace zjistit její pořadí
## Algoritmus:
Například pro permutaci 24153 postupuji následovně (oba postupy zdůvodním později):
### Z tvaru permutace do čísla
1. Setřídím výchozí posloupnost
$12345$
3. Odebírám prvky tak, abych opět vytvořil příslušnou posloupnost, a u každého prvku si poznačím index:
$2: 1345, 1$
$4: 135, 2$
$1: 35, 0$
$5: 3, 1$
$3: NIL, 0$
3. Jednotlivé koeficienty vynásobím příslušným faktoriálem, počínaje $(n-1)!$:
$1*4!=24$
$2*3!=12$
$0*2!=0$
$1*1!=1$
$0*0!=0$
4. Posčítám (a přičtu $1$, je-li permutace č. $1$ brána jako první)
$24+12+0+1+1=38$
Obrácený postup - z čísla vyčíst tvar permutace - probíhá následovně:
### Z čísla do tvaru permutace
1. (Od čísla permutace odečtu $1$.) Dělím číslo permutace koeficienty od $1$ do $n$ a zapisuji si zbytky:
$37/1 = 37;0$
$37/2 = 18;1$
$18/3 = 6;0$
$6/4 = 1;2$
$1/5 = 0;1$
2. Vezmu si setříděnou posloupnost $1\dots n$
$12345$
3. Čtu zbytky v obráceném pořadí. Prvek s příslušným indexem odeberu z posloupnosti a přidám do řetězce:
$1: 2, 1345$
$2: 24, 135$
$0: 241, 35$
$1: 2415, 3$
$0: 24153, NIL$
## Zdůvodnění, důkaz
### Proč faktoriál
Mám-li na $k$-tou pozici zprava umístit číslo, které je momentálně $s$-té v pořadí, musí se napravo od této pozice protočit $(s-1)*(k-1)!$ permutací. Například dvojka na první pozici (pro pět prvků) vyžaduje protočení 24 permutací na posledních 4 pozicích - prvních 24 permutací totiž obsahuje jedničku na první pozici. Poslední prvek bude vždy vyžadovat $0*0!$ permutací, jelikož jediný zbývá v zásobě.
### Převod mezi indexy a číslem permutace
Mezi "kódem" (vybíráním indexů) a číslem permutace existuje vzájemná bijekce. Snadněji toto lze vidět v případě, kdy by se nejednalo o permutace, ale o variace s opakováním. Na prvním místě bych mohl zvolit $n$ čísel, na druhém místě $n$ čísel... celkem tak $n^n$ různých variací. Převod mezi kódem a číslem permutace by tak fungoval jako Hornerovo schéma pro pětkovou soustavu. Obdobný algoritmus lze použít i v tomto případě, počet možných číslic se však liší od různé pozice - a tedy i činitel/dělitel.
Srovnání: pětková soustava oproti soustavě permutací pěti prvků:
Index $0$: $5^4$ vs $4!$
Index $1$: $5^3$ vs $3!$
...
Index $4$: $5^0$ vs $0!$
Maximální číslo permutace je $5!-1$ (jelikož existuje $5!$ permutací) - podobně jako největší čtyřciferné číslo pětkové soustavy je $5^5-1=3124=4444_5$.
Z těchto důvodů lze pro zjištění vybraných indexů použít obdobné algoritmy.