気づけば一発系。ただし、数式の見た目がエグく見えてしまうかもしれない...
問題概要
正の整数 が与えられる。
以上
以下の整数
に対する
-
の値の最大値を求めよ。
制約
考えたこと
全探索すれば だけど、それでは間に合わない。さて、式の見た目がエグくてエグくてやばい。ちょっと思うことは
- もし「小数点以下切り捨て」とかなくて実数演算だったら、
で常に 0 になるなぁ...
というくらいだろうか。よって、なんとなく、この値が大きくなるためには、後半の のところが、でかい小数点を抱え落ちすると良さそうという気持ちになる。たとえば
という具合だ。
手を動かす
しかし、依然としてよくわからないので、こういうのはいくつかの具体例的に手を動かして、試してみると良さそう。
試しにサンプル 1 に従って、、
について考えてみる。そして
に対して値がどのように変わるのかを眺めるのだ。
| |
|
|
差 |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 |
| 2 | 1 | 0 | 1 |
| 3 | 2 | 0 | 2 |
| 4 | 2 | 0 | 2 |
| 5 | 3 | 0 | 3 |
| 6 | 4 | 0 | 4 |
| 7 | 5 | 5 | 0 |
| 8 | 5 | 5 | 0 |
| 9 | 6 | 5 | 1 |
| 10 | 7 | 5 | 2 |
| 11 | 7 | 5 | 2 |
| 12 | 8 | 5 | 3 |
| 13 | 9 | 5 | 4 |
とりあえず気づくことは、
は、周期
で、
だけ増える
ということだ。そしてよくみるとそれは の方も一緒だ。つまり、
の値は、 ごとに周期的になっているということだ!!!よって、
の値としては
を試せば十分ということがわかる。それだけではない。
の範囲で
は単調増加だが
の値は不変
- したがって、
は単調増加
ということもいえる。よって、
を満たす最大の が最適になる。つまり
に対する値を求めれば良い。計算量は
。
#include <bits/stdc++.h> using namespace std; int main() { long long A, B, N; cin >> A >> B >> N; long long x = min(B-1, N); cout << (A*x)/B - A*(x/B) << endl; }