1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | {-# OPTIONS_GHC -O2 #-} import Control.Monad import Control.Monad.ST import Data.Array.ST import Data.Array.Unboxed main = do s <- getContents forM_ (words s) $ \w-> do -- let ps = primesTo (read w) -- print (length ps, last ps) -- leaks badly print (lastPrimes (read w)) -- no leak sieveUA :: Int -> UArray Int Bool sieveUA top = runSTUArray $ do let m = (top-1) `div` 2 r = floor . sqrt . fromIntegral $ top + 1 sieve <- newArray (1,m) True -- :: ST s (STUArray s Int Bool) forM_ [1..r `div` 2] $ \i -> do isPrime <- readArray sieve i when isPrime $ -- ((2*i+1)^2-1)`div`2 = 2*i*(i+1) forM_ [2*i*(i+1), 2*i*(i+2)+1..m] $ \j -> writeArray sieve j False return sieve primesTo :: Int -> [Int] primesTo top = 2 : [i*2+1 | (i,True) <- assocs $ sieveUA top] lastPrimes :: Int -> (Int,[Int]) -- (nth, vals) lastPrimes top = let arr = sieveUA top (b,t) = bounds arr in ( 1 + length [() | (i,True) <- assocs arr] , (if (top < 13) then (2:) else id) $ reverse $ take 5 [ 2*i+1 | i <- [t,t-1..b], arr ! i ] ) {- ST Array [Int] ON ODDS -= n =- -= top =- 30,000: 350,377: 0.01s 3.7MB 100,000: 1,299,709: 0.03s 3.7MB 300,000: 4,256,233: 0.10s 3.7MB 1 mln --> 15,485,863: 0.43s 4.8MB time space (s_0=3.7) 2 mln --> 32,452,843: 0.98s 5.8MB 4 mln --> 67,867,967: 2.31s 8.9MB 1m-> n^1.21 n^1.12 5 mln --> 86,028,121: 3.04s 9.9MB 6 mln --> 104,395,301: 3.77s 10.9MB (leak: was: ***6.7s-227MB***!!!) 6,500,000-> 113,648,393: 4.14s 10.9MB 7 mln --> 122,949,823: 4.52s 11.9MB 7,538,613-> 133,000,999: 4.95s 11.9MB 8 mln --> 141,650,939: 5.32s 13.0MB 4m-> n^1.20 n^0.84 9 mln --> 160,481,183: 6.12s 14.0MB 10 mln --> 179,424,673: 6.91s 15.0MB 15 mln --> 275,604,541: 11.01s 21.1MB 18 mln --> 334,214,459: 13.65s 24.2MB 8m-> n^1.16 n^0.97 (1m->n^1.01) 20 mln --> 373,587,883: TIMEOUT -} |
ey0jIE9QVElPTlNfR0hDIC1PMiAjLX0KCmltcG9ydCBDb250cm9sLk1vbmFkCmltcG9ydCBDb250cm9sLk1vbmFkLlNUCmltcG9ydCBEYXRhLkFycmF5LlNUCmltcG9ydCBEYXRhLkFycmF5LlVuYm94ZWQKCm1haW4gPSBkbwogIHMgPC0gZ2V0Q29udGVudHMKICBmb3JNXyAod29yZHMgcykgJCBcdy0+IGRvCiAgICAtLSBsZXQgcHMgPSBwcmltZXNUbyAocmVhZCB3KQogICAgLS0gcHJpbnQgKGxlbmd0aCBwcywgbGFzdCBwcykgICAgICAgIC0tIGxlYWtzIGJhZGx5CiAgICBwcmludCAobGFzdFByaW1lcyAocmVhZCB3KSkgICAgICAgICAgLS0gbm8gbGVhawogCnNpZXZlVUEgOjogSW50IC0+IFVBcnJheSBJbnQgQm9vbApzaWV2ZVVBIHRvcCA9IHJ1blNUVUFycmF5ICQgZG8KICAgIGxldCBtID0gKHRvcC0xKSBgZGl2YCAyCiAgICAgICAgciA9IGZsb29yIC4gc3FydCAuIGZyb21JbnRlZ3JhbCAkIHRvcCArIDEgCiAgICBzaWV2ZSA8LSBuZXdBcnJheSAoMSxtKSBUcnVlICAgICAgICAgICAgICAgICAtLSA6OiBTVCBzIChTVFVBcnJheSBzIEludCBCb29sKQogICAgZm9yTV8gWzEuLnIgYGRpdmAgMl0gJCBcaSAtPiBkbwogICAgICBpc1ByaW1lIDwtIHJlYWRBcnJheSBzaWV2ZSBpCiAgICAgIHdoZW4gaXNQcmltZSAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSAoKDIqaSsxKV4yLTEpYGRpdmAyID0gMippKihpKzEpCiAgICAgICAgZm9yTV8gWzIqaSooaSsxKSwgMippKihpKzIpKzEuLm1dICQgXGogLT4gCiAgICAgICAgICB3cml0ZUFycmF5IHNpZXZlIGogRmFsc2UKICAgIHJldHVybiBzaWV2ZQogCnByaW1lc1RvIDo6IEludCAtPiBbSW50XQpwcmltZXNUbyB0b3AgPSAyIDogW2kqMisxIHwgKGksVHJ1ZSkgPC0gYXNzb2NzICQgc2lldmVVQSB0b3BdCgpsYXN0UHJpbWVzIDo6IEludCAtPiAoSW50LFtJbnRdKSAgIC0tIChudGgsIHZhbHMpCmxhc3RQcmltZXMgdG9wID0gCiAgbGV0IGFyciAgID0gc2lldmVVQSB0b3AKICAgICAgKGIsdCkgPSBib3VuZHMgYXJyCiAgaW4gCiAgICAgKCAxICsgbGVuZ3RoIFsoKSB8IChpLFRydWUpIDwtIGFzc29jcyBhcnJdCiAgICAgLCAoaWYgKHRvcCA8IDEzKSB0aGVuICgyOikgZWxzZSBpZCkgCiAgICAgICAgJCByZXZlcnNlICQgdGFrZSA1IFsgMippKzEgfCBpIDwtIFt0LHQtMS4uYl0sIGFyciAhIGkgXSApCgp7LQpTVCBBcnJheSBbSW50XSBPTiBPRERTIAogICAgLT0gbiA9LSAgICAtPSB0b3AgPS0gCiAgICAzMCwwMDA6ICAgICAzNTAsMzc3OiAgMC4wMXMgIDMuN01CCiAgIDEwMCwwMDA6ICAgMSwyOTksNzA5OiAgMC4wM3MgIDMuN01CCiAgIDMwMCwwMDA6ICAgNCwyNTYsMjMzOiAgMC4xMHMgIDMuN01CCiAgMSBtbG4gLS0+ICAxNSw0ODUsODYzOiAgMC40M3MgIDQuOE1CICAgICAgICB0aW1lICAgc3BhY2UgKHNfMD0zLjcpCiAgMiBtbG4gLS0+ICAzMiw0NTIsODQzOiAgMC45OHMgIDUuOE1CCiAgNCBtbG4gLS0+ICA2Nyw4NjcsOTY3OiAgMi4zMXMgIDguOU1CICAxbS0+IG5eMS4yMSAgbl4xLjEyCiAgNSBtbG4gLS0+ICA4NiwwMjgsMTIxOiAgMy4wNHMgIDkuOU1CCiAgNiBtbG4gLS0+IDEwNCwzOTUsMzAxOiAgMy43N3MgMTAuOU1CICAgKGxlYWs6IHdhczogKioqNi43cy0yMjdNQioqKiEhISkKNiw1MDAsMDAwLT4gMTEzLDY0OCwzOTM6ICA0LjE0cyAxMC45TUIKICA3IG1sbiAtLT4gMTIyLDk0OSw4MjM6ICA0LjUycyAxMS45TUIKNyw1MzgsNjEzLT4gMTMzLDAwMCw5OTk6ICA0Ljk1cyAxMS45TUIKICA4IG1sbiAtLT4gMTQxLDY1MCw5Mzk6ICA1LjMycyAxMy4wTUIgIDRtLT4gbl4xLjIwICBuXjAuODQKICA5IG1sbiAtLT4gMTYwLDQ4MSwxODM6ICA2LjEycyAxNC4wTUIKIDEwIG1sbiAtLT4gMTc5LDQyNCw2NzM6ICA2LjkxcyAxNS4wTUIKIDE1IG1sbiAtLT4gMjc1LDYwNCw1NDE6IDExLjAxcyAyMS4xTUIKIDE4IG1sbiAtLT4gMzM0LDIxNCw0NTk6IDEzLjY1cyAyNC4yTUIgIDhtLT4gbl4xLjE2ICBuXjAuOTcgKDFtLT5uXjEuMDEpCiAyMCBtbG4gLS0+IDM3Myw1ODcsODgzOiAgICBUSU1FT1VUICAgCi19
-
upload with new input
-
result: Success time: 0.02s memory: 3736 kB returned value: 0
-
result: Success time: 0.02s memory: 3736 kB returned value: 0
-
result: Success time: 2.78s memory: 12976 kB returned value: 0
10 104395305
(4,[2,3,5,7]) (6000001,[104395237,104395267,104395289,104395301,104395303])


