メモ化する。
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);
}
};