AtCoder Beginner Contest 231 E 問題 Minimal payments
問題
提出解答
問題の概要
ある国の通貨は 円通貨のみがある. この硬貨を使って, 円支払うとき, 支払う硬貨の枚数と, お釣りでもらう硬貨の枚数の和の最小値を求めよ.
制約
- に対して, は の倍数
- 入力はすべて整数
解法
お釣りとしてある硬貨を 枚もらうということを, その硬貨を 枚払うとみなすことにより, この問題は以下のように生着できる.
- 最小化:
- 条件
この最小化問題の答えを と書くことにする.
最小値を取るような の条件を考える. まず, は全て の倍数であるから, は の倍数でなくてはならない.
そして, とする. このとき, を
とすると, となる. よって, であるとしてよい.
かつ が の倍数であるような は高々 つしか存在しない. が条件を満たすとき, と固定すると, 整数性を除く条件は
である. であるから, という追加制約の中での最小値は となることがわかった.
よって, かつ を満たす整数 の全体の集合を とすると,
となり, 問題のサイズが小さくなった. また, という初期条件から, 再起を用いて解くことができる.
ここで, の引数はたくさんあるように思えるが, 実は (第1引数) として現れるのは に対して, 以上の最大の整数と最小の整数に限られている. そして, (第2引数以降) としてはその部分の長さにのみ依存する. 以上から, 計算量は であることがわかる *1.
*1: である理由は, long long 型が扱える整数の最大値が であることに由来する.