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: