結果
| 問題 |
No.36 素数が嫌い!
|
| コンテスト | |
| ユーザー |
poapoa
|
| 提出日時 | 2020-08-30 23:23:09 |
| 言語 | Haskell (9.10.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,057 bytes |
| コンパイル時間 | 1,575 ms |
| コンパイル使用メモリ | 175,744 KB |
| 実行使用メモリ | 11,520 KB |
| 最終ジャッジ日時 | 2024-11-15 15:59:05 |
| 合計ジャッジ時間 | 4,776 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 WA * 1 |
| other | AC * 17 WA * 9 |
コンパイルメッセージ
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
ソースコード
import Control.Monad
import Control.Monad.ST
import Data.Bool
import qualified Data.Array.ST as ArrST
import qualified Data.Array.Unboxed as ArrU
sieveUA :: Int -> ArrU.UArray Int Bool
sieveUA top = ArrST.runSTUArray $ do
let m = (top-1) `div` 2
r = floor . sqrt $ fromIntegral top + 1
sieve <- ArrST.newArray (1,m) True
forM_ [1..r `div` 2] $ \i -> do
isPrime <- ArrST.readArray sieve i
when isPrime $ do
forM_ [2*i*(i+1), 2*i*(i+2)+1..m] $ \j -> do
ArrST.writeArray sieve j False
return sieve
primesToUA :: Int -> [Int]
primesToUA top = 2 : [i*2+1 | (i,True) <- ArrU.assocs $ sieveUA top]
main :: IO ()
main = readLn >>= putStrLn . solver
solver :: Int -> String
solver n = bool "NO" "YES" $ func1 n
func1 :: Int -> Bool
func1 n = iter n 0 ps
where
ps = primesToUA 10000000
iter _ p [] = p >= 3
iter i j (l:ls)
| j >= 3 = True
| i `mod` l == 0 = iter i (j + 1) ls
| otherwise = iter i j ls
poapoa