Official

E - Fizz Buzz Difference Editorial by maspy


ヒント → https://atcoder.jp/contests/arc166/editorial/7181


[1] \(R-L\) の最大化

\((L,R)\)\(n_a-n_b\leq n\) を満たすならば \((L,R), (L,R+1), (L,R+2),\ldots\) のいずれかが \(n_a-n_b=n\) を満たします.したがって良い組の定義の条件 \(n_a-n_b=n\)\(n_a-n_b\leq n\) に置き換えても答えは変化しません.そこで以下では \(n_a-n_b\leq n\) を満たす \((L,R)\) を良い組ということにします.

すると,\((L,R)\)\(R-L\) が最大の良い組である場合,\(L-1\) および \(R+1\)\(a\) の倍数であることが分かります.したがって,\(L=al+1,R=ar-1\) と書ける場合のみを考えればよいです.

\(k\) を固定して,\(k=r-l\) が達成できるかどうかを考えます.このとき \(n_a = k-1\) です.

\(n_b\)\(al+1\) 以上の最小の \(b\) の倍数を \(a\) で割った余りから計算できます.より具体的には \(1\leq t\leq b\) に対して \(al+t\)\(b\) の倍数であるとすると,\(n_b = \biggl\lfloor \dfrac{ak-1+b-t}{b}\biggr\rfloor\) です.このことから,\(g = \gcd(a,b)\) として \(n_b = \biggl\lfloor \dfrac{ak-1+b-g}{b}\biggr\rfloor\)\(k\) を固定した場合の \(n_b\) の最大値であることが分かります.

\(k=r-l\) を満たす良い組 \((L,R)\) が存在するための条件は

\[(k-1)-\biggl\lfloor \dfrac{ak-1+b-g}{b}\biggr\rfloor\leq n\]

と表すことができて,ここから \(k\) としてありうる最大値(したがって \(R-L\) としてありうる最大値)が計算できます.


[2] \(L\) の最小化

[1] の議論を踏まえると,\((L,R)=(al+1,ar-1)\)\(R-L\) を最大化するという条件は,\(al+1\) 以上の最小の \(b\) の倍数を \(al+t\) としたときに \(t\) が十分小さいという形で表すことができます.\(L\) の最小値を求めるためには次のような問題を解けばよいです:

【問題】

正整数 \(a,b,c\) が与えられる.\((ax\bmod b) \geq b - c\) を満たすような最小の正整数 \(x\) を求めよ.

このような \(x\) に対して適切に \(y=\lceil ax/b\rceil\) とすれば,\(\frac{a}{b}<\frac{y}{x}\) です.ここで,\(\frac{y}{x}\)\(\frac{a}{b}\) の上側最良近似分数であることが示せます.つまり正整数 \(x',y'\) に対して

\[\frac{b}{a}<\frac{y'}{x'}\leq\frac{y}{x} \implies x\leq x'\]

が成り立ちます.\(\frac{a}{b}\) の上側最良近似分数は Farey 数列 / Stern-Brocot tree を考えれば \(O(\log b)\) 個の 1 次式の形で列挙できて,この問題は \(O(\log b)\) 時間で解くことができます.

なお,AtCoder Library の floor_sum を用いて \(O(\log^2 b)\) 時間で解くこともできます.\((ax\bmod b)\geq b-c\) となる \(x\) の存在が,\(\sum\bigl(\bigl\lfloor\frac{ax+c}{b}\bigr\rfloor-\bigl\lfloor\frac{ax}{b}\bigr\rfloor\bigr)\) の計算により判定できるためです.

posted:
last update: