ABC081B - Shift only

GitHub跳转原题关系图返回列表

计算每个数二进制末尾 0 的个数(ν₂),取最小值即为所有数能同时除以 2 的最大次数。

OJ: atcoder

题目 ID: abc081_b

难度:入门

标签:haskell

日期: 2026-07-10 09:19

题意

NN 个正整数,每次操作将所有偶数除以 2。求最大操作次数。

思路

对每个数计算能除以 2 的次数(即二进制末尾 0 的个数,ν2\nu_2), 取最小值即为答案。

代码

haskell
{-
 Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 rainboy的学习导航网站: https://idx.roj.ac.cn
 create_at: 2026-07-10 10:24
 update_at: 2026-07-10 10:24
-}

-- 二进制末尾0的数量 : lowbit
--

-- 递归函数

calc2 n = if even n then 1 + calc2 (n `div` 2) else 0

main = do
    n <- getLine
    str <- getLine
    let x = map read . words $ str :: [Int]
    print $ minimum $ map calc2 x

另一种写法,使用 getContents 一次读完输入:

haskell
{-
 Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 rainboy的学习导航网站: https://idx.roj.ac.cn
 create_at: 2026-07-10 10:09
 update_at: 2026-07-10 10:09
-}
calc2 0 = 0
calc2 n = if even n then 1 + calc2 (n `div` 2) else 0

main = do
    input <- getContents
    let xs = map read (words input) :: [Int]
    print $ minimum $ map calc2 (tail xs)

复杂度

时间复杂度 O(NlogAmax)O(N \log A_{\max}),空间复杂度 O(1)O(1)

总结

ν2\nu_2 递归计算 + minimum 取最小值。 两种输入方式:getLine 逐行读或 getContents 一次读完。