import Control.Applicative import Control.Monad.State main :: IO () main = do [vl,vr] <- map read . words <$> getLine :: IO [Double] d <- readLn :: IO Double w <- readLn :: IO Double print $ evalState (simulate vl vr w) (0,d) simulate :: Double -> Double -> Double -> State (Double, Double) Double simulate vl vr w = do (dist, d) <- get let t1 = d/(w+vr) t2 = t1+(d-(vl+vr)*t1)/(w+vl) put $ (dist+w*t2, d-(vl+vr)*t2) if abs d < 0.000001 then return dist else simulate vl vr w