import Control.Applicative ((<$>)) import Control.Monad (replicateM_) import Data.Array byteDollarsInverseHelper :: (Int -> Int) -> Int -> Int -> Int -> Int -> Int byteDollarsInverseHelper recur a b c d -- | d < 0 = 0 | otherwise = min cap $ max 1 $ recur (d-a) + recur (d-b) + recur (d-c) where cap = 10000000000000000 byteDollarsInverseCached :: Int -> Int -> Int -> [Int] byteDollarsInverseCached a b c = elems xs where xs = array (0, 4000) [(d, byteDollarsInverseHelper recur a b c d) | d <- [0..4000]] recur d | d < 0 = 0 | otherwise = xs ! d byteDollars' :: Int -> Int -> Int -> Int -> Int byteDollars' a b c n = length . takeWhile (< n) $ byteDollarsInverseCached a b c main :: IO () main = do t <- readLn replicateM_ t $ do [n, a, b, c] <- map read . words <$> getLine print (byteDollars' a b c n)