{-# LANGUAGE BangPatterns #-}

import           Control.Monad.State
import           Data.Char
import           Data.Coerce
import qualified Data.ByteString.Char8             as BSC8
import qualified Data.Vector.Fusion.Stream.Monadic as VFSM
import qualified Data.Vector.Unboxed               as VU
import qualified Data.Vector.Unboxed.Mutable       as VUM

main :: IO ()
main = do
  n  <- readLn :: IO Int
  an <- seqInput n
  dp1 <- VUM.replicate 10 (-123456789 :: Int)
  VUM.unsafeWrite dp1 0 0
  rep n $ \i -> do
    dp2 <- VUM.replicate 10 (0 :: Int)
    rep 10 $ \j -> do
      dpj  <- VUM.unsafeRead dp1 j
      dpja <- VUM.unsafeRead dp1 ((j + an VU.! i) `mod` 10)
      VUM.unsafeWrite dp2 ((j + an VU.! i) `mod` 10) (max dpja (dpj + 1))
    VUM.unsafeMove dp1 dp2
  print =<< VUM.unsafeRead dp1 0

type CParser a = StateT BSC8.ByteString Maybe a
runCParser :: CParser a -> BSC8.ByteString -> Maybe (a, BSC8.ByteString)
runCParser = runStateT
{-# INLINE runCParser #-}
int :: CParser Int
int = coerce $ BSC8.readInt . BSC8.dropWhile isSpace
{-# INLINE int #-}
seqInput :: Int -> IO (VU.Vector Int)
seqInput n = VU.unfoldrN n (runCParser int) <$> BSC8.getLine
{-# INLINE seqInput #-}

stream :: Monad m => Int -> Int -> VFSM.Stream m Int
stream !l !r = VFSM.Stream step l
  where
    step x
      | x < r     = return $ VFSM.Yield x (x + 1)
      | otherwise = return $ VFSM.Done
    {-# INLINE [0] step #-}
{-# INLINE [1] stream #-}

rep :: Monad m => Int -> (Int -> m ()) -> m ()
rep n = flip VFSM.mapM_ (stream 0 n)
{-# INLINE rep #-}