combine :: [Int] -> [Int] combine (x:xs) = foldl f [x] xs where f :: [Int] -> Int -> [Int] f ns n = [(+), (*)] <*> ns <*> [n] check :: Int -> [Int] -> Bool check x xs = elem x (combine xs) parseLine :: String -> (Int,[Int]) parseLine s = (read $ init x, map read xs) where (x:xs) = words s result :: [(Int,[Int])] -> Int result xs = sum . map fst . filter snd $ zip (map fst xs) (map (uncurry check) xs) main :: IO () main = getContents >>= print . result . map parseLine . lines