(define (p n list)
(cond ((< n 0) 0)
((= n 0) 1)
((and (< 0 n) (null? list)) 0)
(else
(sum (lambda (i) (* (c n i) (p (- n i) (cdr list)))) 0 (lambda (x) (+ x 1)) (car list)))))
(define (f m n)
(if (= n 0)
1
(* m (f (- m 1) (- n 1)))))
(define (c m n)
(if (< m n)
0
(let ((l (- m n)))
(if (< l n)
(quotient (f m l) (f l l))
(quotient (f m n) (f n n))))))
(define (sum term a next b)
(if (> a b)
0
(+ (term a)
(sum term (next a) next b))))
(print (p 12 (list 6 4 4 4 3 3 3)))
KGRlZmluZSAocCBuIGxpc3QpCiAgKGNvbmQgKCg8IG4gMCkgMCkKICAgICAgICAoKD0gbiAwKSAxKQogICAgICAgICgoYW5kICg8IDAgbikgKG51bGw/IGxpc3QpKSAwKQogICAgICAgIChlbHNlCiAgICAgICAgIChzdW0gKGxhbWJkYSAoaSkgKCogKGMgbiBpKSAocCAoLSBuIGkpIChjZHIgbGlzdCkpKSkgMCAobGFtYmRhICh4KSAoKyB4IDEpKSAoY2FyIGxpc3QpKSkpKQoKCihkZWZpbmUgKGYgbSBuKQogIChpZiAoPSBuIDApCiAgICAgIDEKICAgICAgKCogbSAoZiAoLSBtIDEpICgtIG4gMSkpKSkpCgooZGVmaW5lIChjIG0gbikKICAoaWYgKDwgbSBuKQogICAgICAwCiAgICAgIChsZXQgKChsICgtIG0gbikpKQogICAgICAgIChpZiAoPCBsIG4pCiAgICAgICAgICAgIChxdW90aWVudCAoZiBtIGwpIChmIGwgbCkpCiAgICAgICAgICAgIChxdW90aWVudCAoZiBtIG4pIChmIG4gbikpKSkpKQoKKGRlZmluZSAoc3VtIHRlcm0gYSBuZXh0IGIpCiAgKGlmICg+IGEgYikKICAgICAgMAogICAgICAoKyAodGVybSBhKQogICAgICAgICAoc3VtIHRlcm0gKG5leHQgYSkgbmV4dCBiKSkpKQoKKHByaW50IChwIDEyIChsaXN0IDYgNCA0IDQgMyAzIDMpKSk=