{-# LANGUAGE BangPatterns #-} import Control.Monad import Control.Monad.State import Data.Array import Data.List import qualified Data.Map as Map import System.IO import Text.Printf g :: Int -> [Int] -> State (Map.Map (Int, [Int]) Int) Int g !p [] = return 0 g !p xs = do m <- get case Map.lookup (p, xs) m of Just x -> return x Nothing -> do ys <- sequence [liftM2 (+) (g (x-1) (takeWhile ( [Int] -> Int f p ps = evalState (g p (sort ps)) Map.empty main :: IO () main = do n <- liftM read getLine forM_ [(1::Int)..n] $ \i -> do [p,q] <- liftM (map read . words) getLine xs <- liftM (map read . words) getLine printf "Case #%d: %d\n" i (f p xs) hFlush stdout