业余喜爱haskell,请大佬们指导一下
因为没有 Data.Vector 包,所以使用了 Map 充当动态数组,请教大佬们有没有好的建议解决此问题
module Main where
import Control.Monad.State
import qualified Data.Map as M
main :: IO ()
main = do
[a, n, m, x] <- fmap read . words <$> getLine
print $ evaluateAns a n m x
calculate :: Int -> State (M.Map Int (Int, Int)) ()
calculate 1 = put . M.fromList $ [(1, (1, 0))]
calculate 2 = calculate 1 >> get >>= put . M.insert 2 (0, 1)
calculate n = do
calculate $ n - 1
cache <- get
let (Just (n1x, n1y)) = M.lookup (n - 1) cache
(Just (n2x, n2y)) = M.lookup (n - 2) cache
put $ M.insert n (n1x + n2x, n1y + n2y) cache
evaluateAns a n m x = flip evalState mempty $ do
calculate n
cache <- get
let (Just (nx, ny)) = M.lookup (n - 1) cache
(Just (mx, my)) = M.lookup x cache
b = (m - nx * a - a) `div` (ny - 1)
return $ (mx + 1) * a + (my - 1) * b