Official

A - Full Moon Editorial by nok0

より高速な解法

この問題は、\(\mathrm{O}(1)\) で解くこともできます。この解説は、ABC-B 程度の難易度の内容となっているので、ステップアップされたい方は是非お読みください。

なお、AtCoder の解説は数式を用いて書かれたものが多く、そのような解説を読むための練習として、この解説は数式による議論が多めとなっています。


問題を数式で定式化してみましょう。答えは以下の条件をともに満たす整数 \(i\) の個数です。

  • \(i \geq 0\)
  • \(M+i P \leq N\)

この条件を式変形すると、以下になります。

  • \(0 \leq i \leq \frac{N-M}{P}\)

\(i\) が整数であることから、\( i \leq \frac{N-M}{P}\) という条件は \( i \leq \lfloor\frac{N-M}{P}\rfloor\) と変形できます。ここで、実数 \(x\) に対して \(\lfloor x \rfloor\) は、\(x\) 以下の最大の整数と定義されます。

以上より、\(0\) 以上 \(\lfloor\frac{N-M}{P}\rfloor\) 以下の整数の個数を求めればよいです。これは、\(\mathrm{max}(0, \lfloor\frac{N-M}{P}\rfloor + 1)\) と一致します。C++ で実装する場合には、負数の割り算に注意してください。

  • 実装例(Python)
n, m, p = map(int, input().split())
print(max(0, (n - m) // p + 1))

posted:
last update: