提出 #4706222
ソースコード 拡げる
;; -*- coding: utf-8 -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
(defparameter OPT
#+swank '(optimize (speed 3) (safety 2))
#-swank '(optimize (speed 3) (safety 0) (debug 0)))
#+swank (progn (ql:quickload '(:fiveam))
(shadow :run)
(use-package :fiveam)))
;; BEGIN_INSERTED_CONTENTS
(defmacro dbg (&rest forms)
#+swank
`(progn
,@(mapcar (lambda (form)
`(format *error-output* "~A => ~A~%" ',form ,form))
forms))
#-swank (declare (ignore forms)))
(defmacro define-int-types (&rest bits)
`(progn
,@(mapcar (lambda (b) `(deftype ,(intern (format nil "UINT~A" b)) () '(unsigned-byte ,b))) bits)
,@(mapcar (lambda (b) `(deftype ,(intern (format nil "INT~A" b)) () '(signed-byte ,b))) bits)))
(define-int-types 2 4 7 8 15 16 31 32 62 63 64)
(defmacro println (obj &optional (stream '*standard-output*))
`(let ((*read-default-float-format* 'double-float))
(prog1 (princ ,obj ,stream) (terpri ,stream))))
(defconstant +mod+ 1000000007)
(defmacro dorange ((var begin end &optional step) &body body)
(let ((step (or step 1))
(end_ (gensym)))
(check-type step (and integer (not (eql 0))))
(check-type var symbol)
`(let ((,end_ ,end))
(declare (type integer ,end_))
(do ((,var ,begin (+ ,var ,step)))
((,(if (> step 0) '>= '<=) ,var ,end_))
(declare (type integer ,var))
,@body))))
;; Hauptteil
;; A: 0, C: 1, G: 2, T: 3
;; XAG-C
;; XGA-C
;; XAC-G
;; AXG-C
;; AGX-C
(defconstant +a+ 0)
(defconstant +c+ 1)
(defconstant +g+ 2)
(defconstant +t+ 3)
(defun main ()
(let* ((n (read))
(dp (make-array (list (1+ n) 4 4 4) :element-type 'uint32 :initial-element 0)))
(declare (uint32 n))
(dotimes (c0 4)
(dotimes (c1 4)
(dotimes (c2 4)
(setf (aref dp 3 c0 c1 c2) 1))))
(setf (aref dp 3 +a+ +g+ +c+) 0)
(setf (aref dp 3 +a+ +c+ +g+) 0)
(setf (aref dp 3 +g+ +a+ +c+) 0)
(dorange (i 3 n)
(declare (uint32 i))
(dotimes (c0 4)
(dotimes (c1 4)
(dotimes (c2 4)
(labels ((update (x)
(setf (aref dp (1+ i) c1 c2 x)
(mod (+ (aref dp (1+ i) c1 c2 x)
(aref dp i c0 c1 c2))
+mod+))))
(declare (inline update))
(cond
((and (= c1 +a+) (= c2 +c+))
(update +c+))
((or (and (= c1 +a+) (= c2 +g+))
(and (= c1 +g+) (= c2 +a+))
(and (= c0 +a+) (= c2 +g+))
(and (= c0 +a+) (= c1 +g+)))
(update +g+))
(t (update +c+)
(update +g+)))
(update +a+)
(update +t+))))))
(println (let ((sum 0))
(declare (uint32 sum))
(dotimes (c0 4)
(dotimes (c1 4)
(dotimes (c2 4)
(setf sum (mod (+ sum (aref dp n c0 c1 c2)) +mod+)))))
sum))))
#-swank(main)
提出情報
提出日時 |
|
問題 |
D - We Like AGC |
ユーザ |
sansaqua |
言語 |
Common Lisp (SBCL 1.1.14) |
得点 |
400 |
コード長 |
3236 Byte |
結果 |
AC |
実行時間 |
99 ms |
メモリ |
18792 KiB |
ジャッジ結果
セット名 |
Sample |
All |
得点 / 配点 |
0 / 0 |
400 / 400 |
結果 |
|
|
セット名 |
テストケース |
Sample |
a01, a02, a03 |
All |
a01, a02, a03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13 |
ケース名 |
結果 |
実行時間 |
メモリ |
a01 |
AC |
97 ms |
18788 KiB |
a02 |
AC |
97 ms |
18788 KiB |
a03 |
AC |
97 ms |
18792 KiB |
b04 |
AC |
97 ms |
18788 KiB |
b05 |
AC |
97 ms |
18784 KiB |
b06 |
AC |
96 ms |
18788 KiB |
b07 |
AC |
97 ms |
18788 KiB |
b08 |
AC |
98 ms |
18784 KiB |
b09 |
AC |
99 ms |
18788 KiB |
b10 |
AC |
97 ms |
18788 KiB |
b11 |
AC |
97 ms |
18788 KiB |
b12 |
AC |
99 ms |
18788 KiB |
b13 |
AC |
97 ms |
18788 KiB |