気づけば一発系。ただし、数式の見た目がエグく見えてしまうかもしれない...
問題概要
正の整数 が与えられる。 以上 以下の整数 に対する
- -
の値の最大値を求めよ。
制約
考えたこと
全探索すれば だけど、それでは間に合わない。さて、式の見た目がエグくてエグくてやばい。ちょっと思うことは
- もし「小数点以下切り捨て」とかなくて実数演算だったら、 で常に 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; }