B - Make Divisible Editorial by SSRS
[1] 平方分割
\(B+Y=Z(A+X)\)なる非負整数 \(X, Y\) と正整数 \(Z\) の組について、\(X+Y\) の最小値を求めればよいです。
\(X=\max(B-A,0), Y=\max(A-B,0), Z=1\) とすると条件を満たせるので、答えは \(\max(A, B)\) 以下になります。従って、\(B+Y \leq 2\times\max(A, B)\) となります。
よって、\(A+X \leq \sqrt{2\times\max(A, B)}\) または \(Z \leq\sqrt{2\times\max(A, B)}\) が成り立つので、\(k=1, 2, \dots, \lfloor\sqrt{2\times\max(A, B)}\rfloor\) について、\(A+X=k\) の場合と \(Z=k\) の場合それぞれについて、\(X+Y\) の最小値を求めればよいです。
[2] \(A+X=k\) の場合
\(A+X=k\) と固定した場合、\(B+Y\) は \(B\) 以上で最小の \(A+X\) の倍数にするのが最適です。
このとき、\(B+Y\) の値は \(k\lceil\frac{B}{k}\rceil\) となります。
[3] \(Z=k\) の場合
\(X\) は \(B \leq k(A+X)\) となる最小の \(X\) にするのが最適なので、\(B \leq kA\) の場合は \(A+X=A\)、そうでない場合は \(A+X=\lceil\frac{B}{k}\rceil\) となります。
このとき、\(B+Y\) の値は \(k(A+X)\) となります。
以上により、テストケースあたり \(\Theta(\sqrt{\max(A, B)})\) 時間で解くことができます。
実装例: https://atcoder.jp/contests/arc150/submissions/35551411
posted:
last update: