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; } };