D - Christmas Trees 解説 by miscalculation53


便宜上、座標 \(A + kM\) に立っているクリスマスツリーを番号 \(k\) のクリスマスツリーと呼びます。番号 \(k\) のクリスマスツリーが高橋君と青木君の間に立っている条件は

\[L \leq A + kM \leq R\]

です。求めるものは、この条件を満たす整数 \(k\) の個数です。

条件を式変形すると

\[\begin{aligned} &\phantom{\iff} L \leq A + kM \leq R \\ &\iff \frac{L - A}{M} \leq k \leq \frac{R - A}{M} \\ &\iff \left\lceil \frac{L - A}{M} \right\rceil \leq k \leq \left\lfloor \frac{R - A}{M} \right\rfloor \end{aligned}\]

となります。ここで、実数 \(x\) に対し \(\lfloor x \rfloor\)\(x\) 以下で最大の整数を、\(\lceil x \rceil\)\(x\) 以上で最小の整数を意味します。

よって、条件を満たす \(k\) の個数は \(\displaystyle \max \left(0, \left\lfloor \frac{R - A}{M} \right\rfloor - \left\lceil \frac{L - A}{M} \right\rceil + 1\right)\) です。(今回の場合は単に \(\displaystyle \left\lfloor \frac{R - A}{M} \right\rfloor - \left\lceil \frac{L - A}{M} \right\rceil + 1\) としても正しいです)

実装においては、\(\displaystyle \left\lceil \frac{a}{b} \right\rceil = \left\lfloor \frac{a + b - 1}{b} \right\rfloor \: \)\(a, b\) は整数、\(b > 0\))を利用すると簡潔に書けます。(公式解説にあるように、C++ 等での / の仕様等には注意してください)

参考リンク:整数と実数と不等号と切り上げと切り捨て - noshi91のメモ

投稿日時:
最終更新: