#include int n, k; int heslo[N_MAX]; // celá permutace int pocty[10]; // počty jednotlivých cifer v podpermutaci // od aktuální pozice do konce int poc_perm = 1; // počet podpermutací, které mohou vytvořit // cifry zaznamenané v poli 'pocty' int main(void) { scanf("%d%d\n", &n, &k); for (int i = 0; i < n; i++) heslo[i] = getchar()-'0'; int i; for (i = n-1; k >= poc_perm; i--) { // každou cifru postupně vyměňujeme za menší ... for (int j = heslo[i]-1; j >= 0; j--) { if (pocty[j]) { poc_perm *= pocty[j]--; poc_perm /= ++pocty[heslo[i]]; k += poc_perm; heslo[i] = j; } } // ... a nakonec rozšíříme podpermutaci i o aktuální pozici poc_perm *= n-i; poc_perm /= ++pocty[heslo[i]]; } for (i++; i < n; i++) { // najdeme nejnižší dostupnou cifru ... heslo[i] = 0; while (!pocty[heslo[i]]) heslo[i]++; // ... tu odebereme z podpermutace ... poc_perm *= pocty[heslo[i]]--; poc_perm /= n-i; // ... a poté se ji budeme poukoušet postupně zvyšovat for (int j = heslo[i]+1; j < 10 && k >= poc_perm; j++) { if (pocty[j]) { k -= poc_perm; poc_perm *= pocty[j]--; poc_perm /= ++pocty[heslo[i]]; heslo[i] = j; } } } for (int i = 0; i < n; i++) putchar(heslo[i]+'0'); putchar('\n'); return 0; }