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

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

AtCoder ABC 327 B - A^A (灰色, 200 点)

素直に for 文で探索すればよいのだけど、意外と A をどこまで探索すればいいのかの判断も難しくて、戸惑った人も多いかもしれない。

問題概要

正の整数  B が与えられる。

 A^{A} = B となる正の整数  A を求めよ。存在しない場合は -1 を出力せよ。

制約

  •  1 \le B \le 10^{18}

考えたこと

基本的には、for 文を用いて  A = 1, 2, 3, \dots と見ていって、 A^{A} B になるかどうかを調べればよい。

問題なのは  A をどこまで調べればよいかだが、実践的には「 A^{A} B を超えてしまったら探索を打ち切る」というようにするのが分かりやすいと思う。

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

int main() {
    long long B;
    cin >> B;
    
    for (long long A = 1;; ++A) {
        // A^A を求める
        long long val = 1;
        for (long long i = 0; i < A; ++i) val *= A;
        
        if (val == B) {
            // B に一致すれば答え
            cout << A << endl;
            return 0;
        } else if (val > B) {
            // B を超えたら打ち切る
            cout << -1 << endl;
            return 0;
        }
    }
}