けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 205 C - POW (5Q, 灰色, 300 点)

愚直に  A^{C} B^{C} を求めようとすると、色んな理由でおかしくなってしまう。数学的に綺麗に処理しよう!

問題概要

整数  A, B, C が与えられる。

 A^{C} B^{C} の大小関係を求めよ (大きい、小さい、等しい)。

制約

  •  -10^{9} \le A, B \le 10^{9}
  •  1 \le C \le 10^{9}

考えたこと

 A^{C} B^{C} はまともに計算するとものすごい桁数になります。そのような数を表現することは非現実的です。そこで、問題の条件を分かりやすいものに言い換えるのをやってみましょう。

 C が偶数の場合は、 A が負でも  A^{C} は正になるといったことが厄介ですね。先に  C が奇数の場合を片付けてしまいましょう。

 C が奇数のとき

この場合は、実はとても単純で、次のことが成り立つのです。


  •  A^{C} \lt B^{C} \Leftrightarrow A \lt B
  •  A^{C} \gt B^{C} \Leftrightarrow A \gt B
  •  A^{C} = B^{C} \Leftrightarrow A = B

 A B が負の場合を考えなくてもよいということで、とても分かりやすいですね。

 C が偶数のとき

 C が偶数であっても、実は少しの修正で上手くいきます。次のように考えられます。


  •  A^{C} \lt B^{C} \Leftrightarrow |A| \lt |B|
  •  A^{C} \gt B^{C} \Leftrightarrow |A| \gt |B|
  •  A^{C} = B^{C} \Leftrightarrow |A| = |B|

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long A, B, C;
    cin >> A >> B >> C;
    
    string res;
    if (C % 2 == 0) {
        // 絶対値の大小関係
        if (abs(A) < abs(B)) res = "<";
        else if (abs(A) > abs(B)) res = ">";
        else res = "=";
    } else {
        // 普通の大小関係
        if (A < B) res = "<";
        else if (A > B) res = ">";
        else res = "=";
    }
    
    cout << res << endl;
}