{-# OPTIONS_GHC -O2 #-} import Control.Monad import Control.Applicative import Text.Printf import Data.List import Data.Array.Unboxed import qualified Data.Map as M import Control.Monad.ST import Data.Array.ST maxN = 100000 f :: Int -> Int -> Int f d = foldl' step 0 . takeWhile (>0) . iterate (`div` 10) where step a x | x `mod` 10 == d = a + 1 | otherwise = a fseq :: [Int] fseq = scanl step 0 [1..] where step s x = s + f 4 x - f 7 x sums :: UArray Int Int sums = runSTUArray $ do a <- newArray (0, maxN) 0 :: ST s (STUArray s Int Int) cnt <- newArray (0, 20000) 0 :: ST s (STUArray s Int Int) writeArray cnt 0 1 forM_ (zip [1..maxN] $ tail fseq) $ \(i, s) -> do pre <- readArray a (i-1) c <- readArray cnt s writeArray a i (pre+c) writeArray cnt s (c+1) return a solve :: Int -> Int solve n = sums ! n main = do (_:ws) <- map read . words <$> getContents forM_ ws $ printf "%d\n" . solve