merge :: [Integer] -> [Integer] -> [Integer]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys)
  | x > y     = x : merge xs (y:ys)
  | otherwise = y : merge (x:xs) ys

fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact (n - 1)

comb :: Integer -> Integer -> Integer
comb _ 0 = 1
comb n k
  | n == k    = 1
  | otherwise = fact n `div` (fact (n - k) * (fact k))

msort :: [Integer] -> [Integer]
msort [] = []
msort [x] = [x]
msort xs = merge (msort $ take h xs) (msort $ drop h xs)
  where h = length xs `div` 2

kinds :: [Integer] -> [Integer]
kinds [] = []
kinds [x] = [x]
kinds (x:xs) = x : kinds xs'
  where xs' = snd $ span (== x) xs

search :: [Integer] -> [Integer] -> [Integer] -> Integer
search [] _ _ = 1
search (x:xs) zs ys = search xs zs ys * (fromIntegral ((fromIntegral $ length $ filter (== x) ys) `comb` (fromIntegral $ length $ filter (== x) zs)))

spareNum :: Double -> (Integer, Double)
spareNum n = (n', n - (fromInteger n'))
  where n' = fst . properFraction $ n :: Integer

printSpared :: Double -> IO ()
printSpared num = do
  let (n, m) = spareNum num
  putStr . show $ n
  putChar '.'
  putStrLn . tail . tail . show $ m

main :: IO ()
main = do
  [n, a, b] <- map read . words <$> getLine :: IO [Integer]
  nums <- msort . map read . words <$> getLine :: IO [Integer]
  let nums' = take (fromIntegral a) nums
      p = (length $ filter (== head nums) nums) == (length nums)
  printSpared $ (fromInteger $ sum nums' :: Double) / (fromInteger a :: Double)
  if p 
  then do
    putStrLn . show $ ((truncate $ 2**(fromIntegral $ length nums)) - 1 :: Integer)
  else do
    putStrLn . show $ search (kinds nums') nums' nums