Cho danh sách số nums và số k. Thực hiện k lần: chọn một số, chọn một bit 0 trong biểu diễn nhị phân của nó, đổi thành 1. Tìm tổng nhỏ nhất có thể sau k phép toán. Kết quả modulo 10⁹+7.
Ví dụ
nums = [4, 7, 3], k = 2
Nhị phân: 4=100, 7=111, 3=011
Đổi 2 bit 0 thấp nhất của 4 (bit 0 và bit 1) → 4 thành 111 (7). Tổng = 7+7+3 = 17.
Thuật toán (Greedy bit thấp nhất)
- Duyệt bit từ thấp (i=0) đến cao.
- Với mỗi bit
i, duyệt tất cả sốntrongnums:- Nếu bit
icủanlà 0: đổi thành 1 (cộng2ⁱvào kết quả),k--. - Nếu
k == 0: dừng.
- Nếu bit
- Kết quả =
(sum(nums) + added) % MOD.
Chiến lược tham lam bit thấp nhất cho tổng tăng thêm nhỏ nhất.
Triển khai Python
class Solution:
def solve(self, nums, k):
MOD = 10**9 + 7
added = 0
bit = 0
while k > 0:
for n in nums:
if (n >> bit) & 1 == 0: # bit i là 0
added += 1 << bit
k -= 1
if k == 0:
break
bit += 1
return (added + sum(nums)) % MOD
# Test
ob = Solution()
print(ob.solve([4, 7, 3], 2)) # Output: 17
Độ phức tạp
- Thời gian: O(k + n × log(max_num)) - thực tế rất nhanh vì k thường nhỏ.
- Không gian: O(1).