import Control.Monad import Control.Monad.ST import Data.Bits import qualified Data.Vector as V import qualified Data.Vector.Mutable as VM import qualified Data.Vector.Unboxed as VU import qualified Data.Vector.Unboxed.Mutable as VUM main :: IO () main = readLn >>= zeta >>= print zeta :: Int -> IO Double zeta n = do let primes = getPrimeVector 10000 xm <- V.unsafeThaw $ V.fromList [1.0] forM_ [0 .. (VU.length primes - 1)] $ \i -> do let p = fromIntegral $ primes VU.! i x = 1.0 / (1.0 - p ** (- (fromIntegral n))) VM.modify xm (\a -> a * x) 0 (V.! 0) <$> V.unsafeFreeze xm getPrimeVector :: Int -> VU.Vector Int getPrimeVector top = VU.filter (/= -1) . VU.imap (\i check -> if i == 0 then 2 else if check then i * 2 + 1 else -1) $! runST $ do let m = (top - 1) `shiftR` 1 r = floor . sqrt . fromIntegral $ (top + 1) sieve <- VU.unsafeThaw $ VU.replicate (m + 1) True forM_ [1 .. r `unsafeShiftR` 1] $ \i -> do isPrime <- VUM.unsafeRead sieve i when isPrime $ do forM_ [2 * i * (i + 1), 2 * i * (i + 2) + 1 .. m] $ \j -> do VUM.unsafeWrite sieve j False VU.unsafeFreeze sieve