以下の内容はhttps://torus711.hatenablog.com/entry/2025/03/17/222643より取得しました。


AtCoder Beginner Contest 397, D : Cubes

問題概要

 整数 $n$ が与えられる.整数の組 $( x, y )$ であって,$x^3 - y^3 = n$ であるようなものを一つ報告せよ.存在しない場合はその旨を報告せよ.

制約

  • $1 \leq n \leq 10^{ 18 }$

解法

 $x, y$ の組合せをすべて試すことが(時間的に)許されるならば何も問題はありませんが,そういうことはできません.また,$x, y$ の内片方を固定しても,固定されていることを $\hat x$ や $\hat y$ で示すとして,与式を固定されていない方について解いた
\[
y^3 = { \hat x }^3 - n
\]

\[
x^3 = n - { \hat y }^3
\]
を眺めてみても(少なくともわたしの数学センスでは)あまりうれしい気持ちになれません.また,$n$ に対して $x, y$ の上界も自明では無い気がします.
 (本番で気付けずにお手上げになってしまったこととして,)$x, y$ の内片方を固定すると他方が自動的に決まるようにしてあげれば,与式は一元 $3$ 次方程式になるので,なんとかなりそうな気配がします.そこで,(問題設定より $x > y$ なので)$x - y$ を固定することにし,
\[
d = x - y
\]
としてみます.そうすると $x = y + d$ なので与式は
\[
( y + d )^3 - y^3 = n
\]
となります.左辺を変形すると
\begin{align*}
( y + d )^3 - y^3 &= y^3 + 3dy^2 + 3d^2y + d^3 - y^3 \\
&= 3dy^2 + 3d^2y + d^3
\end{align*}
となるので,$y^3$ の項が消えて $y$ についての $2$ 次方程式
\[
3dy^2 + 3d^2y + d^3 - n = 0
\]
が得られます.とりあえず
\begin{align*}
a &= 3d \\
b &= 3d^2 \\
c &= d^3 - n
\end{align*}
として,全員が暗記させられる解の公式に突っ込んでみると
\begin{align*}
y &= \frac{ -b \pm \sqrt{ b^2 - 4ac } }{ 2a } \\
&= \frac{ -3d^2 \pm \sqrt{ ( 3d^2 )^2 - 4 ( 3d )( d^3 - n ) } }{ 2( 3d ) }
\end{align*}
が得られます.問題設定から $y > 0, d > 0$ であり $-b = -3d^2 < 0$ なので,$\pm$ の内 $-$ の方は不適です.従って,$d$ を決めると $y$ は(虚数解でなければ)自動的に(実数の範囲で)定まるので,これが正整数になっているかを調べるなどすれば判定できます.
 $d$ をどの範囲で試せばよいのかという問題が残っていますが,
\begin{align*}
x^3 - y^3 &= ( y + d )^3 - y^3 \\
&= 3dy^2 + 3d^2y + d^3
\end{align*}
は $y, d$ の非負性から単調増加であり,
\[
n = 3dy^2 + 3d^2y + d^3 \geq d^3
\]
から
\[
d \leq \sqrt[3] n
\]
と分かるので,$10^6$ まで試せばよいです.
 ということで,各 $d \in [ 1, 2, \dots, 10^6 ]$ について上述の二次方程式を考えて,正整数解をもつものがあればそのときの $y$ と $y$ に応じて自動的に決まる $x$ が解の一つで,条件を満たすものが無ければ解無しです.
 愚直に計算すると $d^4$ の項が 64 ビット整数でもオーバーフローするので 128 ビット整数とか多倍長整数とかを使う必要がありますが,それらを備える言語であれば横着できます.また,平方根の計算も実数として計算してから round して.与式の等式を満たすかどうか調べるなどすると横着できます.

コード

main = do
	n <- readInteger
	printList $ fromMaybe [-1] $ listToMaybe $ do
		d <- [ 1 .. 1000000 ]
		let
			a = 3 * d
			b = 3 * d^2
			c = d^3 - n
		guard $ 0 <= b^2 - 4 * a * c
		let
			rd = round $ sqrt $ fromIntegral $ b^2 - 4 * a * c
			y = ( -b + rd ) `div` ( 2 * a )
			x = y + d
		guard $ 0 < y && x^3 - y^3 == n
		return $ [ x, y ]



以上の内容はhttps://torus711.hatenablog.com/entry/2025/03/17/222643より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14