「認識はあってるけどコードが間違ってる」が一番近いでしょうか。日本語で説明している「ここでしたいこと」を完璧に実装できれば正しく動作するという意味では。
誤答となる入力例も挙げておきます。
1000300030001
正しい出力は入力と同じく1000300030001
になります。(10001 ** 3 == 1000300030001 なので)
誤答の原因はfloat
の誤差です。
実際に計算させてみると、本来10001となるべきなのに、誤差で少し小さい値になるのが分かります。
>>> math.cbrt(1000300030001)
10000.999999999998
こちらの問題の制約に、以下の記述があります。
- $N$は$10^{18}$以下の正整数
ここで、$10^{18}-64$をfloat
に変換してみましょう。
>>> float(10 ** 18 - 64)
1e+18
>>> float(10 ** 18 - 64) == 10 ** 18
True
なんと、$10^{18}$と完全に等しくなってしまいました。
つまり、$10^{18}-64$という数はfloat
では表現できず、$10^{18}$に丸められてしまうのです。
このように、float
ではこの問題の制約を満たす整数を表現しきれません。よって、float
で計算を行うのはまずいということが、問題の制約からも分かります。
競プロでは、float
を使うとWAになるようなテストケースが仕込まれていることがあるので、最初からfloat
を使わない前提でコードをくみ上げる方が無難です。昔、あからさまにmath.log
での計算を狙い撃ちしたようなテストケースを見たことがあります。(以下参照)
最後に、原因が誤差であることを示すため、「ここでしたいこと」を誤差なしで実装してACになったコードを載せておきます。