(define (cumulate f init n)
(define (aux acc n)
(if (= n 0)
acc
(aux (f acc n) (- n 1))))
(aux init n))
(define (factorial n)
(cumulate * 1 n))
(define (power x n)
(cumulate (lambda (acc _) (* acc x)) 1 n))
(define (range n)
(cumulate (lambda (acc n) (cons (- n 1) acc)) '() n))
(define (repeat x n)
(cumulate (lambda (acc _) (cons x acc)) '() n))
(define (repelem m xs)
(apply append (map (lambda (x) (repeat x m)) xs)))
(define (delete_at i xs)
(define (aux j rs xs)
(cond
((null? xs) (cons '() (list (reverse rs))))
((= i j) (cons (list (car xs)) (list (append (reverse rs) (cdr xs)))))
(else (aux (+ j 1) (cons (car xs) rs) (cdr xs)))))
(aux 0 '() xs))
(define (count f xs)
(foldl (lambda (acc x) (+ acc (if (f x) 1 0))) 0 xs))
(define (f r m n)
(define a (repelem m (map (lambda (x) (+ x 1)) (range r))))
(define x (/ (factorial (* r m)) (power (factorial m) r)))
(define (aux acc x n a)
(if (null? a)
(reverse acc)
(let* ((y (/ x (length a)))
(i (floor (/ (remainder (- n 1) x) y))))
(define-values (d rest) (apply values (delete_at i a)))
(if (null? d)
'()
(let* ((d (car d))
(x (floor (* y (+ 1 (count (lambda (x) (= x d)) rest)))))
(n (- n (floor (* y (count (lambda (x) (< x d)) rest))))))
(aux (cons d acc) x n rest))))))
(if (or (< n 1) (< x n))
'()
(aux '() x n a)))
(print (f 9 1 1))
(print (f 9 1 2))
(print (f 9 1 3))
(print (f 9 1 123456))
(print (f 9 1 234567))
(print (f 9 1 362880))
(print (f 4 3 1))
(print (f 4 3 2))
(print (f 4 3 3))
(print (f 4 3 123456))
(print (f 4 3 234567))
(print (f 4 3 369600))