公式

C - ABC conjecture 解説 by kyopro_friends


\(A,B,C\) の順に値を決めて全探索することを考えます。\(A\leq B \leq C\) の条件から、\(A\) が取りうる値の範囲は \(1\leq A\leq \sqrt[3]{N}\) です。また同様に、\(A\) を決めたとき \(B\) が取りうる値の範囲は \(A\leq B \leq \sqrt{\frac{N}{A}}\) であり、\(A,B\) を決めたとき \(C\) が取りうる値の範囲は \(B \leq C \leq \frac{N}{AB}\) です。

これを愚直に行う次のような擬似コードにより、条件を満たす組を全て求めて数えることができます。

擬似コード1(TLE)

ans=0
for A=1 to pow(N,1/3)
	for B=A to pow(N/A,1/2)
		for C=B to N/(A*B)
			ans+=1
print(ans)

この疑似コードにおいて、最も内側にある \(C\) に関するループが実行される回数は明らかに \(\left\lfloor\frac{N}{AB}\right\rfloor-B+1\) 回です。したがって、次のように書き換えることができます。

擬似コード2

ans=0
for A=1 to pow(N,1/3)
	for B=A to pow(N/A,1/2)
		ans+=floor(N/(A*B))-B+1
print(ans)

実はこの擬似コード2は \(O(N^{2/3})\) で動作し、ACを得ることができます。

なお、実装時には誤差に注意してください。

実装例(C)
実装例(Python)

以下では計算量が \(O(N^{2/3})\) になることの説明を行います。

適当な仮定の下、擬似コード2の計算量のオーダーは、4行目の実行回数、すなわちループ回数に一致します。またループ回数は明らかに \(\displaystyle \sum _{A=1}^{\sqrt[3]{N}} \left(\sqrt{\frac{N}{A}}-A+1 \right)\) です。
総和を取る対象を \(A\) の関数とみなすと単調減少であることから
\(\displaystyle \sum _{A=2}^{\sqrt[3]{N}} \left(\sqrt{\frac{N}{A}}-A+1 \right) \leq \int_{1}^{\sqrt[3]{N}}\left(\sqrt{\frac{N}{A}}-A+1 \right)dA\)
となります。(左辺のAの下限が2であることに注意)
(調和級数のオーダーを積分で見積もるときと同様の変形です。図を描いて確認してみましょう)

右辺の積分を計算すると \(O(N^{2/3})\) になることがわかります。したがって
\(\displaystyle \sum _{A=1}^{\sqrt[3]{N}} \left(\sqrt{\frac{N}{A}}-A+1 \right) \leq \left(\sqrt{\frac{N}{1}}-1+1 \right)+O(N^{2/3})=O(N^{2/3})\)
となり、示せました。

投稿日時:
最終更新: