fork download
  1. import qualified Data.Map.Strict as Map
  2. --import qualified Data.Map as Map
  3.  
  4. f (r, s, i0) | s==0 = Left 1
  5. | s<0 || s>r*9 || r==0 = Left 0
  6. | otherwise = Right (zip3 (repeat $ r-1) (map (s-) [i0..9]) (repeat 0), sum)
  7.  
  8. task :: Integer -> Integer -> Integer
  9. task r k = evaluate f (r,k,1)
  10.  
  11. evaluate f n = snd . go n $ Map.empty where
  12. go i m = case f i of
  13. Left v -> (m, v)
  14. Right (l, t) -> (Map.insert i r m', r) where
  15. (m', r) = fmap t $ foldr gf (m, []) l
  16. gf i (m, l) = fmap (:l) $ case Map.lookup i m of
  17. Just v -> (m, v)
  18. Nothing -> go i m
  19. main = do
  20. print $ task 200 $ 90
Success #stdin #stdout 0.15s 6612KB
stdin
Standard input is empty
stdout
11043363007974599505164372331677176732219489057091429478032739165357996660843