(defun mod-inverse (a m) (let ((m0 m) (y 0) (x 1)) (if (= m 1) 0 (progn (loop while (> a 1) do (let ((q (floor a m)) (temp m)) (setf m (mod a m) a temp) (setf temp y y (- x (* q y)) x temp))) (if (< x 0) (+ x m0) x))))) (defun comb-lut (N MOD) (let ((F (make-array (1+ N) :initial-element 1)) (InvF (make-array (1+ N) :initial-element 1))) (loop for i from 1 to N do (setf (aref F i) (mod (* (aref F (1- i)) i) MOD))) (setf (aref InvF N) (mod-inverse (aref F N) MOD)) (loop for i from (1- N) downto 0 do (setf (aref InvF i) (mod (* (aref InvF (1+ i)) (1+ i)) MOD))) (lambda (n r) (assert (and (<= 0 n N) (<= 0 r))) (if (<= 0 r n) (mod (* (mod (* (aref F n) (aref InvF r)) MOD) (aref InvF (- n r))) MOD) 0)))) (defun main () (let* ((MOD 998244353) (N (read)) (A (loop for i from 1 to N collect (read))) (comb (comb-lut (+ N (apply #'max A)) MOD)) (ans 1)) (loop for q from 1 to N for a in A do (setf ans (mod (+ ans (funcall comb (+ q a -1) q)) MOD))) (princ ans)(terpri))) (main)