---
# System prepended metadata

title: Codeforces Round 769 (Div. 2) C(枚舉)
tags: [' 數學', 題解, ' 枚舉']

---

---
title: "Codeforces Round 769 (Div. 2) C(枚舉)"
tags: 題解, 枚舉, 數學
---

https://codeforces.com/contest/1632/problem/C

#### 題意

給兩數 $a$, $b$ ($a$ < $b$)，有三種操作：

- $a$ += 1
- $b$ += 1
- $a$ |= $b$

問最少多少次操作可以讓 $a$ 和 $b$ 相等。

#### 思路

操作一會讓 $a$ 變大、操作二會讓 $b$ 變大、操作三會讓 $a$ 變成比 $b$ 大或等於 $b$。

若 $a$ 比 $b$ 大，只能做操作二來使其相等。

若 $a$ 比 $b$ 小，則可以調整 $a$ 或 $b$ 使 $b$ 變成 $a$ 的 submask，此時做操作三會讓二者相等。

另一種想法是：
遍歷所有可能的 $a$，對於每個 $a$ 找出最小的 $b$ 使得 $b$ 比原來的 $b$ 大且 $b$ 和 $a$ 在 bits 上差距最小。

做法上可以從高位開始看，遇到 $b$ 的 setbit 時同樣設為 setbit、不是 setbit 的話如果 $a$ 是 setbit 則設為 setbit 並更新答案；如果 $a$ 也不是 setbit 則不設為 setbit，因為往下繼續找可以有更小且滿足條件的 $b$。

#### Code

```python=1
def solve():
    A, B = map(int, input().split())

    if A > B:
        print(A - B)
        return

    MAXV = A | B
    ans = B - A
    for a in range(A, MAXV + 1):
        if a | B == B: ans = min(ans, (a - A) + 1)
    for b in range(B, MAXV + 1):
        if A | b == b: ans = min(ans, (b - B) + 1)

    print(ans)

if __name__ == "__main__":
    for i in range(int(input())):
        solve()
```

```python=1
def solve():
    A, B = map(int, input().split())

    if A > B:
        print(A - B)
        return

    ans = B - A
    for a in range(A, B + 1):
        b = 0
        for bit in range(20, -1, -1):
            if (B >> bit) & 1 == 1:
                b |= 1 << bit
            else:
                if (a >> bit) & 1 == 1:
                    b |= 1 << bit
                    break
        ans = min(ans, (a - A) + 1 + ((a | b) - B))

    print(ans)

if __name__ == "__main__":
    for i in range(int(input())):
        solve()
```