メモ化する。
n の m 乗根を探していけばいい。
解法はすぐに思いつくけど、通すのは難しい気がする。
本番通した人はエスパーに違いない。
map<lli, lli> memo; lli lpow(lli n, lli p) { if (p == 0) return 1; if (p == 1) return n; lli m = lpow(n, p / 2); return p % 2 ? (m * m * n) : (m * m); } lli rec(lli n) { if (n == 0) return 0; if (n == 1) return 0; if (n == 2) return 1; if (n == 3) return 2; if (n == 4) return 2; if (n == 5) return 3; if (memo.count(n)) return memo[n]; const lli ln = (lli)ceil(log10(n) / log10(2)); lli mn = n - 1; for (lli p = 2; p <= ln; ++p) { lli x = (lli)floor(pow(n, 1.0 / p)); lli y = (lli)ceil(pow(n, 1.0 / p)); lli a = rec(x) + abs(n - lpow(x, p)); lli b = rec(y) + abs(n - lpow(y, p)); mn = min(mn, min(a + 1, b + 1)); } return memo[n] = mn; } class ThePower { public: int count(long long N) { memo.clear(); return rec(N); } };