B - A^A Editorial by KumaTachiRen


まず \(A=1\) が解になるのは \(B=1\) のときのみなので予め処理しておきます.

\(A=2,3,\dots\) に対し,\(B\)\(A\) で割り切れるだけ割ります.\(B\)\(A\) で割り切れた回数を \(X\)\(B\)\(A\)\(X\) 回割った値を \(Y\) とすれば \(B=A^XY\) であり,\(Y\)\(A\) で割り切れないので,\(A^A=B\) であるための必要十分条件は \(X=A,Y=1\) であることがわかります.

\(X,Y\) は実際に割れば各 \(A\) についてそれぞれ計算量 \(O(\log B)\) で求められます.

なお公式解説では実験した上で \(A\) の上限として \(15\) を取っていますが,この方針であればもう少し雑に評価して \(15\) より大きくとっても 64 bit 整数で問題なく動きます.

#include <iostream>
using namespace std;

void solve() {
  long long B;
  cin >> B;
  if (B == 1) {
    cout << 1 << endl;
    return;
  }
  for (int A = 2; A <= 20; A++) {
    int x = 0;
    long long y = B;
    while (y % A == 0) x++, y /= A;
    if (x == A && y == 1) {
      cout << A << endl;
      return;
    }
  }
  cout << "-1" << endl;
}

int main() {
  solve();
}

posted:
last update: