Solution of RemoveLst

We can observe that:

  1. The first element is always on an odd position, so it never gets removed.
  2. The second value we need to output is located at position 1 + 2i-1, where i is the largest value such that 1 + 2i-1 < N.

A similar approach, implemented in Haskell:

import Data.Bits
import Data.Int

closestPower x = if null smallerPowers then max 1 $ closestPower (x-1)
                                       else x - sum (init smallerPowers)
    where smallerPowers = [2^i | i <- [0..32], not $ elem (x .&. (shift 1 i)) [0, x]]

main = do
    input <- getContents
    let [a,b,n] = map read $ words input :: [Int64]

    putStrLn $ show (a + b) ++ " " ++ show (a * (succ $ closestPower n) + b)
Questions?

Sponsors Gold