この問題は、調和級数の和の性質と、累積最小値を用いることで O(NlogN)O(NlogN) で解くことができます。

問題文を少し簡単にするために、以下のように定義される関数 g(x)g(x) について考えます。

  • x=A×Bx=A×B となる非負整数 A,BA,B における、A+BA+B の最小値

AABB の値を全探索することで、g(0)g(0) から g(N)g(N) すべての値を篩の要領で求められます。
A×BNA×B \leq N となる A,BA,B の組の全探索は O(NlogN)O(NlogN) で処理できます。   

関数 g(x)g(x) が求まったので、関数 f(x)f(x) の定義を以下のように言い換えることができます。

  • x=A+Px=A+P となる非負整数 A,PA,P における、A+g(P)A+g(P) の最小値

ここで P=xAP=x-A とおくと、f(x)f(x) は以下のようになります。

f(x)=min0Ax(f(x)=min_{0\leq A \leq x}( A+g(xA)A+g(x-A) ))

これを愚直に計算すると O(N2)O(N^2) になりますが、

f(x):=min(f(x1)+1,g(x))f(x):=min(f(x-1)+1, g(x))

として、xxが小さい方から累積最小値をとっていくことで、 O(N)O(N) で計算できます。

よってこの問題は O(NlogN)O(NlogN) で解くことができます。

(スタックオーバーフローに注意してください)
解答例(C++)
解答例(Python)