Submission #5123059


Source Code Expand

(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 '(:cl-debug-print :fiveam))
                 (shadow :run)
                 (use-package :fiveam)))
#+swank (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)

;; BEGIN_INSERTED_CONTENTS
(declaim ((simple-array double-float (*)) *bernoulli*))
(defparameter *bernoulli*
  #.(coerce
     (mapcar (lambda (x) (float x 1d0))
             '(1 -1/2 1/6 0 -1/30 0 1/42 0 -1/30 0 5/66 0 -691/2730 0 7/6 0 -3617/510 0 43867/798 0 -174611/330 0 854513/138 0 -236364091/2730 0 8553103/6 0 -23749461029/870 0 8615841276005/14332 0))
     '(simple-array double-float (*))))

(declaim ((simple-array (unsigned-byte 62) (*)) *factorial*))
(defparameter *factorial*
  (make-array 21 :element-type '(unsigned-byte 62) :initial-contents '(1 1 2 6 24 120 720 5040 40320 362880 3628800 39916800 479001600 6227020800 87178291200 1307674368000 20922789888000 355687428096000 6402373705728000 121645100408832000 2432902008176640000)))

(declaim (ftype (function * (values double-float &optional)) log-factorial))
(defun log-factorial (n &optional (terms 4))
  (declare #.OPT
           (uint62 n)
           ((unsigned-byte 8) terms))
  (if (<= n 20)
      (log (float (aref *factorial* n) 1d0))
      (let ((n (float n 1d0)))
        (+ #.(log (sqrt (* 2d0 pi)))
           (* (+ n 0.5d0) (log n))
           (- n)
           (loop for i2 from 2 to (* terms 2) by 2
                 sum (/ (aref *bernoulli* i2)
                        (* i2 (- i2 1) (expt n (- i2 1))))
                 of-type double-float)))))

(declaim (ftype (function * (values double-float &optional)) log-binomial))
(defun log-binomial (n k &optional (terms 4))
  (declare (uint62 n k))
  (assert (>= n k))
  (- (log-factorial n terms)
     (log-factorial (- n k) terms)
     (log-factorial k terms)))

(defmacro dbg (&rest forms)
  #+swank
  (if (= (length forms) 1)
      `(format *error-output* "~A => ~A~%" ',(car forms) ,(car forms))
      `(format *error-output* "~A => ~A~%" ',forms `(,,@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)

(declaim (inline println))
(defun println (obj &optional (stream *standard-output*))
  (let ((*read-default-float-format* 'double-float))
    (prog1 (princ obj stream) (terpri stream))))

(defconstant +mod+ 1000000007)

;; Body

;; The probability that you go parallel to the x-axis k+ times by +D, k- times
;; by -D, to the y-axis l+ times by +D, l- times by -D.
(defun calc (k+ k- l+ l- n)
  (declare (uint32 k+ k- l+ l- n))
  (assert (= n (+ k+ k- l+ l-)))
  (exp (+ (log-binomial n k+ 3)
          (log-binomial (- n k+) k- 3)
          (log-binomial (- n k+ k-) l- 3)
          (- (* n (log 4))))))

(defun main ()
  (declare #.OPT)
  (let* ((n (read))
         (d (read))
         (x (read))
         (y (read)))
    (declare (int32 n d x y))
    (if (zerop (mod x d))
        (setf x (floor x d))
        (progn (println 0)
               (return-from main)))
    (if (zerop (mod y d))
        (setf y (floor y d))
        (progn (println 0)
               (return-from main)))
    (let ((res 0d0))
      (declare (double-float res))
      (loop for k+ from 0 to n
            for k- = (- k+ x)
            when (<= 0 k- n)
            do (when (evenp (- n k+ k- y))
                 (let ((l+ (floor (+ n (- k+) (- k-) y) 2))
                       (l- (floor (- n k+ k- y) 2)))
                   (when (and (<= 0 l+ n)
                              (<= 0 l- n))
                     (incf res (calc k+ k- l+ l- n))))))
      (println res))))

#-swank(main)

Submission Info

Submission Time
Task D - 大ジャンプ
User sansaqua
Language Common Lisp (SBCL 1.1.14)
Score 101
Code Size 4082 Byte
Status AC
Exec Time 210 ms
Memory 25312 KiB

Judge Result

Set Name part1 part2 All
Score / Max Score 90 / 90 10 / 10 1 / 1
Status
AC × 23
AC × 36
AC × 71
Set Name Test Cases
part1 test_1_151403858_0_0AB.txt, test_1_1_0_1AB.txt, test_1_1_2_0AB.txt, test_1_200416616_-430405070_-79858930AB.txt, test_1_320861287_0_0AB.txt, test_1_445441131_0_0AB.txt, test_2_91743015_0_183486030AB.txt, test_3_165357536_496072608_0AB.txt, test_3_357154050_-106436394_768502001AB.txt, test_3_721501125_-568833455_353553641AB.txt, test_3_893846474_0_0AB.txt, test_4_291388018_-291388018_0AB.txt, test_5_318547875_955643625_-637095750AB.txt, test_5_704387671_-704387671_0AB.txt, test_5_82323965_639854915_-688317394AB.txt, test_6_187422602_374845204_-374845204AB.txt, test_6_346164451_0_0AB.txt, test_6_99058019_194123640_-837769837AB.txt, test_7_166330212_166330212_-332660424AB.txt, test_7_89698746_448493730_-179397492AB.txt, test_8_10000000_-40000000_-40000000AB.txt, test_8_10000000_0_80000000AB.txt, test_8_10000000_80000000_0AB.txt
part2 test_10_227248639_454497278_0B.txt, test_11_692637325_-181424149_-938839075B.txt, test_13_260236679_-780710037_-520473358B.txt, test_13_269280357_807841071_269280357B.txt, test_13_96859935_0_-581159610B.txt, test_16_40374395_-40374395_-565241530B.txt, test_1_151403858_0_0AB.txt, test_1_1_0_1AB.txt, test_1_1_2_0AB.txt, test_1_200416616_-430405070_-79858930AB.txt, test_1_320861287_0_0AB.txt, test_1_445441131_0_0AB.txt, test_21_304856339_609712678_914569017B.txt, test_26_214390232_-857560928_428780464B.txt, test_2_91743015_0_183486030AB.txt, test_30_10000000_-300000000_0B.txt, test_30_10000000_0_300000000B.txt, test_30_10000000_150000000_-150000000B.txt, test_30_54228128_0_813421920B.txt, test_3_165357536_496072608_0AB.txt, test_3_357154050_-106436394_768502001AB.txt, test_3_721501125_-568833455_353553641AB.txt, test_3_893846474_0_0AB.txt, test_4_291388018_-291388018_0AB.txt, test_5_318547875_955643625_-637095750AB.txt, test_5_704387671_-704387671_0AB.txt, test_5_82323965_639854915_-688317394AB.txt, test_6_187422602_374845204_-374845204AB.txt, test_6_346164451_0_0AB.txt, test_6_99058019_194123640_-837769837AB.txt, test_7_166330212_166330212_-332660424AB.txt, test_7_89698746_448493730_-179397492AB.txt, test_8_10000000_-40000000_-40000000AB.txt, test_8_10000000_0_80000000AB.txt, test_8_10000000_80000000_0AB.txt, test_9_283198156_849594468_849594468B.txt
All sample_01.txt, sample_02.txt, sample_03.txt, test_1000_1000000_-500000000_500000000.txt, test_1000_1000000_0_-1000000000.txt, test_1000_1000000_1000000000_0.txt, test_1000_150305_97998860_-32315575.txt, test_1000_1_0_0.txt, test_1000_1_2_0.txt, test_1000_1_2_2.txt, test_1000_3308678_-800700076_-350719868.txt, test_1000_3608549_811923525_689232859.txt, test_1000_3728577_-145414503_-969430020.txt, test_1000_537976_11297496_224335992.txt, test_10_227248639_454497278_0B.txt, test_11_692637325_-181424149_-938839075B.txt, test_130_95365311_-667557177_-286095933.txt, test_131_18204705_-145637640_0.txt, test_13_260236679_-780710037_-520473358B.txt, test_13_269280357_807841071_269280357B.txt, test_13_96859935_0_-581159610B.txt, test_16_40374395_-40374395_-565241530B.txt, test_1_151403858_0_0AB.txt, test_1_1_0_1AB.txt, test_1_1_2_0AB.txt, test_1_200416616_-430405070_-79858930AB.txt, test_1_320861287_0_0AB.txt, test_1_445441131_0_0AB.txt, test_210_28974130_0_260767170.txt, test_217_321156_24407856_22480920.txt, test_21_304856339_609712678_914569017B.txt, test_26_214390232_-857560928_428780464B.txt, test_289_421462830_-487186374_-417635361.txt, test_2_91743015_0_183486030AB.txt, test_30_10000000_-300000000_0B.txt, test_30_10000000_0_300000000B.txt, test_30_10000000_150000000_-150000000B.txt, test_30_54228128_0_813421920B.txt, test_339_4475128_957677392_281933064.txt, test_3_165357536_496072608_0AB.txt, test_3_357154050_-106436394_768502001AB.txt, test_3_721501125_-568833455_353553641AB.txt, test_3_893846474_0_0AB.txt, test_480_402960_-131767920_-34654560.txt, test_4_291388018_-291388018_0AB.txt, test_507_3516183_-879045750_-253165176.txt, test_515_8606048_-25818144_8606048.txt, test_522_2286376_-230923976_-18291008.txt, test_5_318547875_955643625_-637095750AB.txt, test_5_704387671_-704387671_0AB.txt, test_5_82323965_639854915_-688317394AB.txt, test_676_198114948_0_792459792.txt, test_688_151937211_-286341114_10198771.txt, test_6_187422602_374845204_-374845204AB.txt, test_6_346164451_0_0AB.txt, test_6_99058019_194123640_-837769837AB.txt, test_71_367604060_367604060_0.txt, test_752_120973200_0_-725839200.txt, test_772_881340073_0_0.txt, test_777_125719576_-499451637_822057459.txt, test_7_166330212_166330212_-332660424AB.txt, test_7_89698746_448493730_-179397492AB.txt, test_839_166155061_0_-332310122.txt, test_839_923157_923157_564972084.txt, test_849_415705_290993500_0.txt, test_873_418406_2928842_322172620.txt, test_8_10000000_-40000000_-40000000AB.txt, test_8_10000000_0_80000000AB.txt, test_8_10000000_80000000_0AB.txt, test_981_159373724_-637494896_-159373724.txt, test_9_283198156_849594468_849594468B.txt
Case Name Status Exec Time Memory
sample_01.txt AC 210 ms 25312 KiB
sample_02.txt AC 61 ms 12900 KiB
sample_03.txt AC 60 ms 12896 KiB
test_1000_1000000_-500000000_500000000.txt AC 60 ms 12900 KiB
test_1000_1000000_0_-1000000000.txt AC 60 ms 12900 KiB
test_1000_1000000_1000000000_0.txt AC 60 ms 12900 KiB
test_1000_150305_97998860_-32315575.txt AC 60 ms 12900 KiB
test_1000_1_0_0.txt AC 62 ms 15072 KiB
test_1000_1_2_0.txt AC 62 ms 14944 KiB
test_1000_1_2_2.txt AC 63 ms 14948 KiB
test_1000_3308678_-800700076_-350719868.txt AC 62 ms 14948 KiB
test_1000_3608549_811923525_689232859.txt AC 62 ms 14948 KiB
test_1000_3728577_-145414503_-969430020.txt AC 60 ms 12904 KiB
test_1000_537976_11297496_224335992.txt AC 62 ms 14948 KiB
test_10_227248639_454497278_0B.txt AC 60 ms 12900 KiB
test_11_692637325_-181424149_-938839075B.txt AC 60 ms 12900 KiB
test_130_95365311_-667557177_-286095933.txt AC 60 ms 12900 KiB
test_131_18204705_-145637640_0.txt AC 60 ms 12900 KiB
test_13_260236679_-780710037_-520473358B.txt AC 60 ms 12900 KiB
test_13_269280357_807841071_269280357B.txt AC 61 ms 12904 KiB
test_13_96859935_0_-581159610B.txt AC 60 ms 12904 KiB
test_16_40374395_-40374395_-565241530B.txt AC 60 ms 12904 KiB
test_1_151403858_0_0AB.txt AC 60 ms 12904 KiB
test_1_1_0_1AB.txt AC 60 ms 12900 KiB
test_1_1_2_0AB.txt AC 60 ms 12896 KiB
test_1_200416616_-430405070_-79858930AB.txt AC 60 ms 12900 KiB
test_1_320861287_0_0AB.txt AC 60 ms 12900 KiB
test_1_445441131_0_0AB.txt AC 60 ms 12900 KiB
test_210_28974130_0_260767170.txt AC 61 ms 12900 KiB
test_217_321156_24407856_22480920.txt AC 60 ms 12896 KiB
test_21_304856339_609712678_914569017B.txt AC 62 ms 12900 KiB
test_26_214390232_-857560928_428780464B.txt AC 60 ms 12900 KiB
test_289_421462830_-487186374_-417635361.txt AC 60 ms 12896 KiB
test_2_91743015_0_183486030AB.txt AC 60 ms 12900 KiB
test_30_10000000_-300000000_0B.txt AC 61 ms 12900 KiB
test_30_10000000_0_300000000B.txt AC 60 ms 12900 KiB
test_30_10000000_150000000_-150000000B.txt AC 62 ms 12900 KiB
test_30_54228128_0_813421920B.txt AC 61 ms 12896 KiB
test_339_4475128_957677392_281933064.txt AC 61 ms 12896 KiB
test_3_165357536_496072608_0AB.txt AC 60 ms 12900 KiB
test_3_357154050_-106436394_768502001AB.txt AC 60 ms 12904 KiB
test_3_721501125_-568833455_353553641AB.txt AC 60 ms 12900 KiB
test_3_893846474_0_0AB.txt AC 61 ms 12900 KiB
test_480_402960_-131767920_-34654560.txt AC 60 ms 12900 KiB
test_4_291388018_-291388018_0AB.txt AC 60 ms 12900 KiB
test_507_3516183_-879045750_-253165176.txt AC 60 ms 12896 KiB
test_515_8606048_-25818144_8606048.txt AC 60 ms 12904 KiB
test_522_2286376_-230923976_-18291008.txt AC 60 ms 12896 KiB
test_5_318547875_955643625_-637095750AB.txt AC 60 ms 12896 KiB
test_5_704387671_-704387671_0AB.txt AC 60 ms 12904 KiB
test_5_82323965_639854915_-688317394AB.txt AC 60 ms 12900 KiB
test_676_198114948_0_792459792.txt AC 62 ms 14948 KiB
test_688_151937211_-286341114_10198771.txt AC 60 ms 12900 KiB
test_6_187422602_374845204_-374845204AB.txt AC 61 ms 12900 KiB
test_6_346164451_0_0AB.txt AC 61 ms 12900 KiB
test_6_99058019_194123640_-837769837AB.txt AC 63 ms 12904 KiB
test_71_367604060_367604060_0.txt AC 61 ms 12900 KiB
test_752_120973200_0_-725839200.txt AC 62 ms 14952 KiB
test_772_881340073_0_0.txt AC 62 ms 14952 KiB
test_777_125719576_-499451637_822057459.txt AC 61 ms 12896 KiB
test_7_166330212_166330212_-332660424AB.txt AC 61 ms 12900 KiB
test_7_89698746_448493730_-179397492AB.txt AC 60 ms 12900 KiB
test_839_166155061_0_-332310122.txt AC 60 ms 12904 KiB
test_839_923157_923157_564972084.txt AC 61 ms 12900 KiB
test_849_415705_290993500_0.txt AC 61 ms 12900 KiB
test_873_418406_2928842_322172620.txt AC 60 ms 12904 KiB
test_8_10000000_-40000000_-40000000AB.txt AC 60 ms 12904 KiB
test_8_10000000_0_80000000AB.txt AC 60 ms 12896 KiB
test_8_10000000_80000000_0AB.txt AC 60 ms 12904 KiB
test_981_159373724_-637494896_-159373724.txt AC 62 ms 14952 KiB
test_9_283198156_849594468_849594468B.txt AC 61 ms 12904 KiB