結果
問題 | No.140 みんなで旅行 |
ユーザー | こまる |
提出日時 | 2020-12-14 03:48:59 |
言語 | Haskell (9.8.2) |
結果 |
WA
|
実行時間 | - |
コード長 | 5,885 bytes |
コンパイル時間 | 1,675 ms |
コンパイル使用メモリ | 196,608 KB |
実行使用メモリ | 32,884 KB |
最終ジャッジ日時 | 2024-09-20 00:24:37 |
合計ジャッジ時間 | 2,867 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 17 ms
12,412 KB |
testcase_01 | WA | - |
testcase_02 | WA | - |
testcase_03 | AC | 17 ms
12,408 KB |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
コンパイルメッセージ
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
ソースコード
{-# LANGUAGE BangPatterns #-} {-# LANGUAGE NumericUnderscores #-} import Control.Monad import Control.Monad.Cont import Control.Monad.ST import Data.IORef import qualified Data.Vector.Fusion.Stream.Monadic as VFSM import qualified Data.Vector.Unboxed as VU import qualified Data.Vector.Unboxed.Mutable as VUM modulus :: Int modulus = 1_000_000_007 {-# INLINE modulus #-} main :: IO () main = do n <- readLn :: IO Int a <- VUM.replicate (600 * 600) 0 :: IO (VUM.IOVector Int) b <- VUM.replicate (600 * 600) 0 :: IO (VUM.IOVector Int) c <- VUM.replicate (600 * 600) 0 :: IO (VUM.IOVector Int) rep 600 $ \i -> rep' i $ \j -> if j == 0 || j == i then VUM.unsafeWrite c (i * 600 + j) 1 else do item1 <- VUM.unsafeRead c ((i - 1) * 600 + j) item2 <- VUM.unsafeRead c ((i - 1) * 600 + j - 1) VUM.unsafeWrite c (i * 600 + j) ((item1 + item2) `mod` modulus) rep1 600 $ \i -> do VUM.unsafeWrite a (i * 600 + 1) 1 range 2 i $ \j -> do item1 <- VUM.unsafeRead a ((i - 1) * 600 + j) item2 <- VUM.unsafeRead a ((i - 1) * 600 + j - 1) VUM.unsafeWrite a ((i - 1) * 600 + j) ((item1 * j + item2) `mod` modulus) rep1 600 $ \i -> do VUM.unsafeWrite b (i * 600) 1 rep1 600 $ \j -> do item <- VUM.unsafeRead b (i * 600 + j - 1) VUM.unsafeWrite b (i * 600 + j) (item * i * (i - 1) `mod` modulus) ansRef <- newIORef (0 :: Int) rep1' n $ \x -> rep1' x $ \y -> do let z = n - x temp <- VUM.unsafeRead c (n * 600 + x) axy <- VUM.unsafeRead a (x * 600 + y) byz <- VUM.unsafeRead b (y * 600 + z) let temp' = temp * axy `mod` modulus temp'' = temp' * byz `mod` modulus modifyIORef ansRef (flip mod modulus . (+ temp'')) print =<< readIORef ansRef ------------------------------------------------------------------------------- -- for ------------------------------------------------------------------------------- rep :: Monad m => Int -> (Int -> m ()) -> m () rep n = flip VFSM.mapM_ (stream 0 n) {-# INLINE rep #-} rep' :: Monad m => Int -> (Int -> m ()) -> m () rep' n = flip VFSM.mapM_ (stream 0 (n + 1)) {-# INLINE rep' #-} rep1 :: Monad m => Int -> (Int -> m ()) -> m () rep1 n = flip VFSM.mapM_ (stream 1 n) {-# INLINE rep1 #-} rep1' :: Monad m => Int -> (Int -> m ()) -> m () rep1' n = flip VFSM.mapM_ (stream 1 (n + 1)) {-# INLINE rep1' #-} rev :: Monad m => Int -> (Int -> m ()) -> m () rev n = flip VFSM.mapM_ (streamR 0 n) {-# INLINE rev #-} rev' :: Monad m => Int -> (Int -> m ()) -> m () rev' n = flip VFSM.mapM_ (streamR 0 (n + 1)) {-# INLINE rev' #-} rev1 :: Monad m => Int -> (Int -> m ()) -> m () rev1 n = flip VFSM.mapM_ (streamR 1 n) {-# INLINE rev1 #-} rev1' :: Monad m => Int -> (Int -> m ()) -> m () rev1' n = flip VFSM.mapM_ (streamR 1 (n + 1)) {-# INLINE rev1' #-} range :: Monad m => Int -> Int -> (Int -> m ()) -> m () range l r = flip VFSM.mapM_ (stream l (r + 1)) {-# INLINE range #-} rangeR :: Monad m => Int -> Int -> (Int -> m ()) -> m () rangeR r l = flip VFSM.mapM_ (streamR l (r + 1)) {-# INLINE rangeR #-} forStep :: Monad m => Int -> Int -> Int -> (Int -> m ()) -> m () forStep l r d = flip VFSM.mapM_ (streamStep l r d) {-# INLINE forStep #-} forStepR :: Monad m => Int -> Int -> Int -> (Int -> m ()) -> m () forStepR r l d = flip VFSM.mapM_ (streamStepR l r d) {-# INLINE forStepR #-} forP :: Monad m => Int -> (Int -> m ()) -> m () forP p = flip VFSM.mapM_ (streamG 2 p (^) 2 (+) 1) {-# INLINE forP #-} forG :: Monad m => Int -> Int -> (Int -> Int -> Int) -> Int -> (Int -> Int -> Int) -> Int -> (Int -> m ()) -> m () forG l r f p g d = flip VFSM.mapM_ (streamG l r f p g d) {-# INLINE forG #-} forRG :: Monad m => Int -> Int -> (Int -> Int -> Int) -> Int -> (Int -> Int -> Int) -> Int -> (Int -> m ()) -> m () forRG r l f p g d = flip VFSM.mapM_ (streamRG r l f p g d) {-# INLINE forRG #-} stream :: Monad m => Int -> Int -> VFSM.Stream m Int stream !l !r = VFSM.Stream step l where step x | x < r = return $ VFSM.Yield x (x + 1) | otherwise = return VFSM.Done {-# INLINE [0] step #-} {-# INLINE [1] stream #-} streamR :: Monad m => Int -> Int -> VFSM.Stream m Int streamR !l !r = VFSM.Stream step (r - 1) where step x | x >= l = return $ VFSM.Yield x (x - 1) | otherwise = return VFSM.Done {-# INLINE [0] step #-} {-# INLINE [1] streamR #-} streamStep :: Monad m => Int -> Int -> Int -> VFSM.Stream m Int streamStep !l !r !d = VFSM.Stream step l where step x | x <= r = return $ VFSM.Yield x (x + d) | otherwise = return VFSM.Done {-# INLINE [0] step #-} {-# INLINE [1] streamStep #-} streamStepR :: Monad m => Int -> Int -> Int -> VFSM.Stream m Int streamStepR !l !r !d = VFSM.Stream step r where step x | x >= l = return $ VFSM.Yield x (x - d) | otherwise = return VFSM.Done {-# INLINE [0] step #-} {-# INLINE [1] streamStepR #-} streamG :: Monad m => Int -> Int -> (Int -> Int -> Int) -> Int -> (Int -> Int -> Int) -> Int -> VFSM.Stream m Int streamG !l !r !f !p !g !d = VFSM.Stream step l where step x | f x p <= r = return $ VFSM.Yield x (g x d) | otherwise = return VFSM.Done {-# INLINE [0] step #-} {-# INLINE [1] streamG #-} streamRG :: Monad m => Int -> Int -> (Int -> Int -> Int) -> Int -> (Int -> Int -> Int) -> Int -> VFSM.Stream m Int streamRG !r !l !f !p !g !d = VFSM.Stream step r where step x | f x p >= l = return $ VFSM.Yield x (g x d) | otherwise = return VFSM.Done {-# INLINE [0] step #-} {-# INLINE [1] streamRG #-} withBreakIO :: ((r -> ContT r IO b) -> ContT r IO r) -> IO r withBreakIO = flip runContT pure . callCC {-# INLINE withBreakIO #-} withBreakST :: ((r -> ContT r (ST s) b) -> ContT r (ST s) r) -> (ST s) r withBreakST = flip runContT pure . callCC {-# INLINE withBreakST #-}