Advertisement
Guest User

Untitled

a guest
May 28th, 2015
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.11 KB | None | 0 0
  1. import Control.Monad
  2. import Text.Printf
  3. import Control.Applicative
  4. import qualified Data.List as L
  5.  
  6. main :: IO()
  7. main = do
  8. testCase <- readLn
  9. forM_ [1..testCase] $ \i -> do
  10. [_, n] <- words <$> getLine
  11. m <- map read.words <$> getLine
  12. let ans = slv (read n :: Integer) m
  13. printf "Case #%d: %d\n" (i :: Int) ans
  14.  
  15. slv :: Integer -> [Integer] -> Int
  16. slv n m | remHumanIdx < 0 = fromIntegral n
  17. | otherwise = 1 + ((L.elemIndices True okBarbers) !! remHumanIdx)
  18. where prevTime = bSearch n m (0, 10^16)
  19. fixHumanNum = fromTime2human prevTime m
  20. remHumanIdx = fromIntegral (n - fixHumanNum) - 1
  21. okBarbers = map (\x -> (prevTime + 1) `mod` x == 0) m
  22.  
  23. bSearch :: Integer -> [Integer] -> (Integer, Integer) -> Integer
  24. bSearch n m (start, end) | middle == start = start
  25. | middleCnt >= n = bSearch n m (start, middle)
  26. | middleCnt < n = bSearch n m (middle, end)
  27. where middle = (start + end) `div` 2
  28. middleCnt = fromTime2human middle m
  29.  
  30. fromTime2human :: Integer -> [Integer] -> Integer
  31. fromTime2human t = sum . (map (\x -> (t `div` x) + 1))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement