--- /dev/null
+import Data.List
+-- import Data.Ord
+import Data.Traversable
+import Control.Applicative
+
+type MergedMachine = (Int, Int) -- production time, number of machines
+
+
+main :: IO ()
+main = do
+ line1 <- getLine
+ line2 <- getLine
+ let params = map (read :: String -> Int) $ words line1
+ let required = params !! 1
+ let machines = map read $ words line2
+ let mergedMachines = merge machines
+ -- print required
+ -- print machines
+ print mergedMachines
+ print $ length mergedMachines
+ print $ solve required mergedMachines
+
+merge :: [Int] -> [MergedMachine]
+merge machines = [(head g, length g) | g <- grouped_machines]
+ where sorted_machines = sort machines
+ grouped_machines = group sorted_machines
+
+
+-- solve :: Int -> [Int] -> Int
+solve required ms = (lcm_chunks * lcm_time) + length requiredRun - 1
+ -- lcm_production
+ where lcm_time = lcms $ fmap fst ms
+ lcm_production = sum $ [(lcm_time `div` p) * n | (p, n) <- ms]
+ lcm_chunks = required `div` lcm_production
+ remaining = required `mod` lcm_production
+ prods = productions ms
+ -- requiredRun = takeWhile (< required) $ totalProductions prods
+ requiredRun = takeUntil (>= remaining) $ totalProductions prods
+ -- sorted_ms = sortOn Down ms
+
+lcms :: [Int] -> Int
+lcms ns = foldl1 lcm ns
+
+productions :: [MergedMachine] -> [[Int]]
+productions machines = fmap manufactured machines
+
+manufactured :: MergedMachine -> [Int]
+manufactured (t, n) = go [0, n..]
+ where go (p:ps) = replicate t p ++ go ps
+
+totalProductions :: [[Int]] -> [Int]
+totalProductions prods = fmap sum $ getZipList $ sequenceA $ fmap ZipList prods
+
+takeUntil _ [] = []
+takeUntil p (x:xs)
+ | p x = [x]
+ | otherwise = x : takeUntil p xs