fork download
  1. {-# OPTIONS_GHC -O2 #-}
  2. import Control.Monad
  3. import Control.Applicative
  4. import Text.Printf
  5. import Data.List
  6. import Data.Array.Unboxed
  7. import qualified Data.Map as M
  8. import Control.Monad.ST
  9. import Data.Array.ST
  10.  
  11. maxN = 100000
  12.  
  13. f :: Int -> Int -> Int
  14. f d = foldl' step 0 . takeWhile (>0) . iterate (`div` 10)
  15. where step a x | x `mod` 10 == d = a + 1
  16. | otherwise = a
  17.  
  18. fseq :: [Int]
  19. fseq = scanl step 0 [1..]
  20. where step s x = s + f 4 x - f 7 x
  21.  
  22. sums :: UArray Int Int
  23. sums = runSTUArray $ do
  24. a <- newArray (0, maxN) 0 :: ST s (STUArray s Int Int)
  25. cnt <- newArray (0, 20000) 0 :: ST s (STUArray s Int Int)
  26. writeArray cnt 0 1
  27. forM_ (zip [1..maxN] $ tail fseq) $ \(i, s) -> do
  28. pre <- readArray a (i-1)
  29. c <- readArray cnt s
  30. writeArray a i (pre+c)
  31. writeArray cnt s (c+1)
  32. return a
  33.  
  34. solve :: Int -> Int
  35. solve n = sums ! n
  36.  
  37. main = do
  38. (_:ws) <- map read . words <$> getContents
  39. forM_ ws $ printf "%d\n" . solve
  40.  
Success #stdin #stdout 0.14s 4868KB
stdin
3
3
10
100
100000
stdout
6
31
1266
84589473