むずい.考えの流れを整理しておく.
【類題】
考え方
$N\leq 10^{10}$だから,$N$になる数を調べることはできない.よって,$a^{b}$で表せる数を重複なくカウントして,$N$から引く方針.一番単純な方法として,「$a,b$の全探索+setの利用」が考えられる(うまくいく気がしないと思って,この前探索を諦めてはダメ!).この計算量を真面目に考える.
まず,$a$の範囲を考える.$b \geq 2$だから,$a^{2} \leq a^{b} \leq N$より$a \leq \sqrt{N} \leq 10^{5}$となる.よって,$b$の探索範囲が小さければ,全探索できる.
$b$の範囲を考える.$a\geq 2$を固定したとき,$ a^{b} \leq N$より
\begin{aligned}
b
& \leq \frac{\log(N)}{\log(a)} \\
& \leq \frac{10 \log 10}{\log 2} (\simeq 33.2)
\end{aligned}
だから,$b$の探索範囲は狭い (Divide[10 log 10,log 2] - Wolfram|Alpha).b
& \leq \frac{\log(N)}{\log(a)} \\
& \leq \frac{10 \log 10}{\log 2} (\simeq 33.2)
\end{aligned}
※ $a=2$の場合が$b$の探索範囲が一番広くなる.$2^{10} =1024$より大体$2^{30}\sim 10^{9}$のように考えれば,もっとざっくり考察できる.
回答例
N = int(input()) memo =set() a = 2 while a <= 10 ** 5: b = 2 while True: c = a ** b if c > N: break memo.add(c) b += 1 a += 1 print(N - len(memo))