; the 147 puzzle
(define (f k)
(let ((fss (list)))
(let loop1 ((k k) (n 1) (d 1) (fs (list)))
(if (= k 1)
(if (zero? (modulo d n))
(set! fss (cons (cons (/ d n) fs) fss)))
(let ((lo (if (null? fs) (+ (quotient d n) 1)
(max (car fs) (+ (quotient d n) 1))))
(hi (quotient (* k d) n)))
(let loop2 ((a lo))
(when (<= a hi)
(let* ((new-d (lcm a d))
(new-n (- (* n new-d (/ d)) (/ new-d a))))
(loop1 (- k 1) new-n new-d (cons a fs)))
(loop2 (+ a 1)))))))
(reverse (map reverse fss))))
(for-each
(lambda (x) (display x) (newline))
(f 5))