{-# OPTIONS_GHC -O2 #-} module Main where import Array main = interact (\s-> show $ primes () !! (read s - 1)) primes :: () -> [Int] primes () = 2: primes' -- marking off composites on Array segments where -- between consecutive primes squares, on odds primes' = 3: sieve primes' 3 [] sieve (p:ps) x fs = let q = (p*p-x)`div`2 a = accumArray (\b c-> False) True (1,q-1) [(i,()) | (s,y) <- fs, i <- [y+s,y+s+s..q]] in [i*2 + x | (i,e) <- assocs a, e] ++ sieve ps (p*p) ((p,0):[(s,rem (y-q) s) | (s,y) <- fs]) {- segmented generation: O(n^) delta O(n^) 1,000: 7,919 0.00s 3.7MB 30,000: 350,377 0.09s 4.7MB 1.0 100,000: 1,299,709 0.51s 1.44 5.8MB 2.1 0.6 300,000: 4,256,233 2.49s 1.44 12.9MB 9.2 1.3 0.9 600,000: 8,960,453 6.77s 1.44 21.1MB 17.4 0.9 1.2 1.0 1,000,000: 15,485,863 14.09s 1.43 38.5MB 34.8 1.4 0.9 1.2 1.0 ARR/odds: O(n^) delta O(n^) 1,000: 0.00s 3.7MB 30,000: 0.02s 4.8MB 1.1 100,000: 0.06s 7.8MB 4.1 1.1 300,000: 0.27s 17.1MB 13.4 1.1 600,000: 0.61s 1.18 30.3MB 26.6 1.0 1 mln: 15,485,863 1.18s 1.29 52.9MB 49.2 1.2 2 mln: 32,452,843 2.84s 1.27 87.7MB 84.0 0.8 3 mln: 49,979,687 5.01s 1.40 137.9MB 134.2 1.2 0.9 4 mln: 67,867,967 8.44s 1.81 203.4MB 199.7 1.4 1.2 5 mln: 86,028,121 11.90s 1.54 240.3MB 236.6 0.8 1.1 1.1 -}