yukicoder:No.141 魔法少女コバ
問題
https://yukicoder.me/problems/no/141
数学問題。以下のいずれかの操作ができるとき、 1 から m/n にするまでにかかる操作の最小回数を求めよ。
操作
1. a を a+1 にする
2. a を 1/a にする
考え方
逆から考えていく。すなわち以下の操作ができるとする。
操作
1. a を a-1 にする
2. a を 1/a にする
m は負にはなりえない。m < n の場合は 1 の操作はできないので 2 の操作をする。逆に m > n の場合、 2 の操作をしても結局もとの数に戻るので 2 の操作をする意味はない。無限ループになる。よって 1 の操作をする。この時、単純にシミュレーションするとm が n に比べて非常に大きい場合に時間がかかりすぎる。結局引くことのできる最大の回数は m / n で求めることができ、引いたあとの数は m % n となる。割り切れる場合は 0 になる手前の n になる場合に一致する。
public static void main(String[] args) { Scanner in = new Scanner(System.in); int m = in.nextInt(), n = in.nextInt(); long s = 0; while (m != n) { if (m > n) { s += m/n; m %= n; if (m == 0) { s--; break; } } else { int t = m; m = n; n = t; s++; } } System.out.println(s); }
ポイント
- 引き算の回数は、剰余を考えると効率化できる。