import qualified Data.Map.Strict as Map --import qualified Data.Map as Map f (r, s, i0) | s==0 = Left 1 | s<0 || s>r*9 || r==0 = Left 0 | otherwise = Right (zip3 (repeat $ r-1) (map (s-) [i0..9]) (repeat 0), sum) task :: Integer -> Integer -> Integer task r k = evaluate f (r,k,1) evaluate f n = snd . go n $ Map.empty where go i m = case f i of Left v -> (m, v) Right (l, t) -> (Map.insert i r m', r) where (m', r) = fmap t $ foldr gf (m, []) l gf i (m, l) = fmap (:l) $ case Map.lookup i m of Just v -> (m, v) Nothing -> go i m main = do print $ task 200 $ 90