include xpllib; \for Print and StrLen define Maxx = 12; char Super; int Pos, Cnt(Maxx); func FactSum(N); \1! + 2! + ... + n! int N, S, X, F; [S:= 0; X:= 0; F:= 1; while X < N do [X:= X+1; F:= F*X; S:= S+F; ]; return S; ]; func R(N); int N, C; [if N = 0 then return false; C:= Super(Pos - N); Cnt(N):= Cnt(N)-1; if Cnt(N) = 0 then [Cnt(N):= N; if R(N-1) = 0 then return false; ]; Super(Pos):= C; Pos:= Pos+1; return true; ]; proc Superperm(N); int N, I, Len; [Pos:= N; Len:= FactSum(N); Super:= ReallocMem(Super, Len+1); Super(Len):= 0; for I:= 0 to N do Cnt(I):= I; for I:= 1 to N do Super(I-1):= I+^0; while R(N) do []; ]; int N; [Super:= 0; for N:= 0 to Maxx-1 do [Print("Superperm(%d) ", N); Superperm(N); Print("len = %d", StrLen(Super)); \Uncomment next line to see the string itself \Print(": %s", Super); CrLf(0); ]; ]