---
# System prepended metadata

title: Codeforces Round 624 (Div. 3) D(枚舉+剪枝)
tags: [' 數學', 題解, ' 枚舉']

---

---
title: "Codeforces Round 624 (Div. 3) D(枚舉+剪枝)"
tags: 題解, 枚舉, 數學
---

https://codeforces.com/contest/1311/problem/D

#### 題意

給 $a, b, c$ 三個數，滿足 $a<=b<=c$。每次操作可以選一個數+1或-1，求最少操作次數使得最後的三個數 $A, B, C$ 滿足 $A$ 可以整除 $B$、$B$ 可以整除 $C$。

#### 思路

首先 $A$ 只會在 $[1, 2a]$ 的範圍，超過的話不如直接選 $1$；$B$ 也只會在 $[1, 2A]$，且同時必須是 $A$ 的倍數；$C$ 只要在 $B$ 確定後選擇最近的 $B$ 的倍數，可在 $O(1)$ 得到。

#### Code

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

    mind = INF
    abc = (A, B, C)
    for a in range(1, 2 * A + 1):
        for b in range(a, 2 * B + 1, a):
            c1 = (C // b) * b
            c2 = (C // b + 1) * b
            if abs(A - a) + abs(B - b) + abs(C - c1) < mind:
                mind = abs(A - a) + abs(B - b) + abs(C - c1)
                abc = (a, b, c1)
            if abs(A - a) + abs(B - b) + abs(C - c2) < mind:
                mind = abs(A - a) + abs(B - b) + abs(C - c2)
                abc = (a, b, c2)
    print(mind)
    print(*abc)

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