Official

G - Sqrt Editorial by kyopro_friends


どのように操作しても \(A\) の項は早々に \(1\) になるため、操作回数は無視してよいです。

\(O(X^{1/2})\) 解法

\(dp[x]\) を、\(A_1=x\) から始めて作ることができる \(A\) の種類数とします。\(A_2\) の値の決め方を考えることで \(dp[x]=\sum_{i=1}^{\lfloor \sqrt{x}\rfloor}dp[i]\) となります。この式により、\(dp[x]\)\(x\) が小さい方から順に計算することができます。\(i\leq \lfloor \sqrt{X}\rfloor\) の範囲について、累積和を計算しながら \(dp\) テーブルを埋めていくことで、\(dp[X]\)\(O(\sqrt{X})\) で求めることができます。

\(O(X^{1/4})\) 解法

同様に \(dp[x]\) を定義します。\(O(X^{1/2})\) 解法では \(A_2\) の値の決め方を考えましたが、こちらでは代わりに \(A_3\) の決め方を考えます。\(A_1=x,A_3=i\) のとき、\(A_2\)\(i^2\) 以上 \(\sqrt{x}\) 以下の値を自由に取れます。したがって、\(dp[x]=\sum_{i=1}^{\lfloor x^{1/4}\rfloor}(\lfloor\sqrt{x}\rfloor-i^2+1)dp[i]\) となります。\(i\leq \lfloor X^{1/4} \rfloor\) の範囲については \(O(X^{1/2})\) 解法で述べた方法により計算することで、\(dp[X]\)\(O(X^{1/4})\) で求めることができます。

以上により、この問題はクエリあたり \(O(X^{1/4})\) で解くことができました。

実装例(C)

なお、適切に累積和を取ることで、前計算 \(O(X^{1/4})\) 、クエリ \(O(1)\) で解くこともできます。

実装例(C)

posted:
last update: