結果

問題 No.58 イカサマなサイコロ
ユーザー ducktailducktail
提出日時 2018-07-17 15:03:53
言語 Haskell
(9.8.2)
結果
AC  
実行時間 3 ms / 5,000 ms
コード長 860 bytes
コンパイル時間 11,986 ms
コンパイル使用メモリ 205,980 KB
実行使用メモリ 5,632 KB
最終ジャッジ日時 2024-05-03 20:42:07
合計ジャッジ時間 8,350 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 3 ms
5,632 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 1 ms
5,376 KB
testcase_08 AC 2 ms
5,376 KB
testcase_09 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
Loaded package environment from /home/judge/.ghc/x86_64-linux-9.8.2/environments/default
[1 of 2] Compiling Main             ( Main.hs, Main.o )
[2 of 2] Linking a.out

ソースコード

diff #

import Control.Applicative ((<$>), (<*>))
import Control.Monad (guard)
import Data.List (foldl')
import Data.Vector.Unboxed (Vector, (!), (//))
import qualified Data.Vector.Unboxed as V

main :: IO ()
main = solve <$> readLn <*> readLn >>= print

solve :: Int -> Int -> Double
solve n k = sum $ do
  ti <- [0 .. 6*n]
  ji <- [0 .. 6*n]
  guard $ ti > ji
  return $ dpt ! ti * dpj ! ji
  where dpt = foldl' f ((V.replicate (6*n+1) 0) // [(0,1.0)]) ((replicate (n-k) l1) ++ (replicate k l2))
        dpj = foldl' f ((V.replicate (6*n+1) 0) // [(0,1.0)]) (replicate n l1)
        f dp ds = V.accum (+) (V.replicate (6*n+1) 0) $ do
          (v, p) <- ds
          i <- [0..6*n]
          guard $ i >= v
          return (i, dp ! (i-v) / p)

l1 = [(1,6.0),(2,6.0),(3,6.0),(4,6.0),(5,6.0),(6,6.0)] :: [(Int,Double)]
l2 = [(4,3.0),(5,3.0),(6,3.0)] :: [(Int,Double)]
0