【AtCoder】ABC 465 D - X to Y

D - X to Y
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
AtCoder
実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 839 / NoviSteps: 1Q / 配点: 400 点
問題概要
整数 と 以上の整数 が与えられる。
変数 があり、はじめ である。 これから、 に対して以下の操作を 回以上何回でも行うことを考える。
- または を満たす整数 を選び、 の値を に置き換える。
とするために必要な操作回数の最小値を求めよ。 ただし、制約下では有限回の操作で とする方法が必ず存在することが証明できる。
個のテストケースが与えられるので、それぞれについて答えを求めること。
制約
考察
ともに で割るのは変わらないので、とりあえず をそれぞれ で割り続けてみる。
例えばサンプルケース1の3番目のテストケースなら、
この場合、 から上の遷移をたどって一旦 までもっていき、その後下の遷移に移って まで戻すことができるので、操作回数は 回となる。
したがって、 となるまで「両者の大きい方を で割った商に置き換える」操作を繰り返し、その回数を記録すればよい。
実装例
CPP
1.#include <bits/stdc++.h>2.using namespace std;3. 4.using ll = long long;5. 6.// ======================================== //7. 8.ll solve() {9. ll X, Y, K;10. cin >> X >> Y >> K;11. 12. ll ans = 0;13. while (X != Y) {14. if (X > Y) X /= K;15. else Y /= K;16. 17. ans++;18. }19. 20. return ans;21.}22. 23.int main()24.{25. int T;26. cin >> T;27. 28. while (T--) {29. cout << solve() << endl;30. }31. 32. return 0;33.}https://atcoder.jp/contests/abc465/submissions/77192258
atcoder.jp
実装時間: 20分
コメント
思ったよりもシンプルなコードで解けてびっくり。





