読者です 読者をやめる 読者になる 読者になる

SRM628 Div1Easy DivisorsPower

解説
乗数決め打ちして二分探索で解こうとしていたけど、乗数の大きい物から計算していけばその必要はなかった。2^60 = 1.1529215e+18 > 10^18 は覚えておいたほうが良い。
また、桁落ちを考慮してEPSを挟む必要がある(正答コード見てわかりました)

class DivisorsPower {
public:
  typedef long long ll;
  
  ll get_divi(int n) {
    int cnt = 0;
    for(int i=1; i*i<=n; i++) {
      if(n%i == 0) {
        cnt ++;
        if(i != n/i) cnt ++;
      }
    }
    return cnt;
  }
  
  long long findArgument(long long n) {
    for(int i=60; i>=2; i--) {
      ll x = pow(n, 1./i) + 1e-7;
      ll hx = powl(x, (double)i);
      if(hx == n && get_divi(x) == i) return x;
    }
    return -1;
  }
};