目次

まとめ:まず、形式的冪級数を用いて問題を整理し、合成関数を求める問題に帰着します。ここで求めたい合成関数 A(B(x))A(B(x)) の中身 B(x)B(x) が特殊な形をしていることを利用して、高速に合成を求めることができます。 O(NlogN)O(N \log N) または O(Nlog2N)O(N \log^2 N) 時間でこの問題に正解することができます。

  • 目次
  • 考察
    • 導入
    • B(x)B(x) の表示
    • D(x)D(x) の表示
    • まとめ
  • O(NlogN)O(N \log N) の方法…想定解(Pypy3 でも通る)
    • 前半戦
    • 後半戦
  • O(Nlog2N)O(N \log^2 N) の方法 1…想定解
    • 漸化式・行列
    • 分割統治
    • 定数倍高速化
  • O(Nlog2N)O(N \log^2 N) の方法 2…新しい解法(合成を求める)
  • O(Nlog2N)O(N \log^2 N) の方法 3…新しい解法
    • 定数倍高速化

考察

導入

問題の答えを a1a_1 とします。操作の 「1,+1-1, +1 から等確率で選ぶ」の部分を「1,+1-1, +1 のどちらか一方を選ぶ」に変更したとき、ありえる操作すべてに対するスコアの総和を a2a_2 とします。このとき、 a1=a2/2Na_1 = a_2 / 2^N であることが分かります。 1/2Nmod9982443531/2^N \bmod{998244353} は容易に計算できるため、代わりに a2a_2 を計算することを考えます。

しょぼん君の操作による動きをパスと呼ぶことにします。次のように形式的冪級数を定めます。

  • B(x)B(x) は、座標 00 から出発し nn ステップ目で座標 00 に初めて戻ってくる長さ nn のパスの個数が xnx^n の係数になるような形式的冪級数
  • D(x)D(x) は、座標 00 から出発して座標 00 に一度も戻らないような長さ nn のパスの個数が xnx^n の係数になるような形式的冪級数
  • A(x)A(x) は、 A(x)=A0+A1x++ANxNA(x) = A_0 + A_1 x + \cdots + A_N x^N を満たす多項式
  • F(x)F(x) は、長さ nn のパスすべてに対するスコアの合計が xnx^n の係数になるような形式的冪級数

求めたいものは [xN]F(x)[x^N] F(x) です。ここで、「座標 00 にちょうど kk 回戻ってくる」、すなわちスコア AkA_k を獲得できるようなパスの個数の母関数は

B(x)kD(x)B(x)^kD(x)

と表されるため、 F(x)F(x) は次のように表せます。

F(x)=A0D(x)+A1B(x)D(x)+A2B(x)2D(x)++ANB(x)ND(x)=D(x)A(B(x))F(x)\\ = A_0 D(x) + A_1 B(x) D(x) + A_2 B(x)^2 D(x) + \cdots + A_N B(x)^N D(x)\\ = D(x)A(B(x))

B(x)B(x) の表示

B(x)B(x)D(x)D(x) を具体的に表示してみます。 B(x)B(x) は「座標 00 から出発し、 00 に初めて戻って来る」というものでした。もし 11 回目で座標 11 に行ったとすると、22 から n1n-1 回目では座標 11 以上のみを動きnn 回目で座標 101 \to 0 にもどってくる、ということになります。そして、 11 回目で座標 1-1 に行ったときも同様です。

22 から n1n-1 回目の全 n2n-2 回において、これは「座標 00 からスタートし、座標 00 以上を n2n-2 回動き、座標 00 に戻ってくる」方法の数と同じで、この場合の数はカタラン数と同じです。 nn が奇数のときは 00 通り、偶数のときは 1(n2)/2+1(n2(n2)/2)\frac{1}{(n-2)/2 + 1}\binom{n-2}{(n-2)/2} となります。

カタラン数の母関数 C(x)C(x)

C(x)=n01n+1(2nn)xn=1+x+2x2+5x3+14x4+42x5+C(x)\\ = \sum_{n\ge 0} \frac{1}{n+1} \binom{2n}{n} x^n\\ = 1 + x + 2x^2 + 5x^3 + 14x^4 + 42x^5 + \cdots

とおくと、B(x)B(x)

B(x)=2x2C(x2)=2x2+2x4+4x6+10x8+28x10+84x12+B(x)\\ = 2x^2 C(x^2)\\ = 2x^2 + 2x^4 + 4x^6 + 10x^8 + 28x^{10} + 84x^{12} + \cdots

と表されます。ここで、カタラン数の母関数は

C(x)=114x2x\displaystyle C(x) = \frac{1 - \sqrt{1-4x}}{2x}

であるので、

B(x)=2x2C(x2)=114x2B(x) = 2x^2 C(x^2) = 1 - \sqrt{1-4x^2}

が分かりました。

D(x)D(x) の表示

次に、D(x)D(x) について、余事象は「00 からスタートし、 00 に戻ってくる瞬間が存在する」ですが、 00 に初めて戻ってくるのが何回目であるかで場合分けすれば、

[xn]D(x)=2n[xn]B(x)2[xn1]B(x)2n[x0]B(x)[x^n] D(x) = 2^n - [x^n] B(x) - 2[x^{n-1}] B(x) - \cdots - 2^n [x^0] B(x)

が得られます。これはとくに、

[xn]D(x)=2n[xn]B(x)12x=[xn]1B(x)12x\displaystyle [x^n] D(x)\\ = 2^n - [x^n] \frac{B(x)}{1-2x}\\ = [x^n] \frac{1-B(x)}{1-2x}

であるため、

D(x)=14x212x\displaystyle D(x) = \frac{\sqrt{1-4x^2}}{1-2x}

が分かります。

まとめ

以上を整理すると、求めるべきものは

[xN]F(x)=[xN]D(x)A(B(x))=[xN]14x212xA(114x2)\displaystyle [x^N] F(x)\\ = [x^N] D(x) A(B(x))\\ = [x^N] \frac{\sqrt{1-4x^2}}{1-2x} A \left( 1- \sqrt{1-4x^2}\right)

になります。

O(NlogN)O(N \log N) の方法

前半戦

今回の場合、合成関数の中身 114x21 - \sqrt{1-4x^2} が簡単であるため、合成関数を直接「ほどく」イメージで求められます。

A(114x2)A(1-\sqrt{1-4x^2}) に対して次のように式変形します。

A(114x2)=i=0NAi(114x2)i=i=0NAik=0i(ik)(14x2)k=k=0N(14x2)ki=kNAi(ik)=k=0N(14x2)k[xk](i=0NAi(1+x)i)\displaystyle A(1 - \sqrt{1-4x^2})\\ = \sum_{i=0}^N A_i (1 - \sqrt{1-4x^2})^i\\ = \sum_{i=0}^N A_i \sum_{k=0}^i \binom{i}{k} (- \sqrt{1-4x^2})^{k}\\ = \sum_{k=0}^N (-\sqrt{1-4x^2})^{k} \sum_{i=k}^N A_i \binom{i}{k} \\ = \sum_{k=0}^N (-\sqrt{1-4x^2})^{k} [x^k] \left(\sum_{i=0}^N A_i (1+x)^i\right)

ここで、 i=0NAi(1+x)i=P0+P1x++PNxN\sum_{i=0}^N A_i (1+x)^i = P_0 + P_1 x + \cdots + P_N x^N とおきます。そうすると、

A(114x2)=k=0NPk(14x2)k\displaystyle A(1 - \sqrt{1-4x^2}) = \sum_{k=0}^N P_k (-\sqrt{1-4x^2})^{k}

です。そして、 P0,P1,,PNP_0, P_1, \cdots, P_N は次のように O(NlogN)O(N \log N) 時間で求められます:

I(x)=i=0NAixiI(x) = \sum_{i=0}^N A_i x^i

とおきます。このとき、求めたい多項式は I(x+1)I(x+1) であり、その各項は Polynomial Taylor Shift というテクニックを用いて求められます。

Polynomial Taylor Shift については、 ABC215-G のユーザー解説 (MMNMM さん) をご覧ください。

後半戦

A(114x2)=k=0NPk(14x2)k\displaystyle A(1 - \sqrt{1-4x^2}) = \sum_{k=0}^N P_k (-\sqrt{1-4x^2})^{k}

の各係数を求めたいです。 kk の偶奇で分け、

k=0NPk(14x2)k=k=0N/2P2k(14x2)k14x2k=0(N1)/2P2k+1(14x2)k\displaystyle \sum_{k=0}^N P_k (-\sqrt{1-4x^2})^{k}\\ = \sum_{k=0}^{\lfloor N/2 \rfloor} P_{2k} (1-4x^2)^{k} - \sqrt{1-4x^2} \sum_{k=0}^{\lfloor (N-1)/2 \rfloor} P_{2k+1} (1-4x^2)^{k}

とします。ここで、

k=0N/2P2k(14x2)k=X0+X1x++XNxN\sum_{k=0}^{\lfloor N/2 \rfloor} P_{2k} (1-4x^2)^{k} = X_0 + X_1 x + \cdots + X_N x^N

k=0(N1)/2P2k+1(14x2)k=Y0+Y1x++YNxN\sum_{k=0}^{\lfloor (N-1)/2 \rfloor} P_{2k+1} (1-4x^2)^{k} = Y_0 + Y_1 x + \cdots + Y_N x^N

とおくと、

A(114x2)=(X0+X1x+XNxN)14x2(Y0+Y1x+YNxN)\displaystyle A(1 - \sqrt{1-4x^2})\\ = (X_0 + X_1 x + \cdots X_N x^N) - \sqrt{1-4x^2} (Y_0 + Y_1 x + \cdots Y_N x^N)

となります。いま、 Xi,YiX_i, Y_i の各項をすべて求めることは、同じく Polynomial Taylor Shift によって O(NlogN)O(N \log N) 時間で出来ます。

そして、 14x2=(14x2)1/2\sqrt{1-4x^2} = (1-4x^2)^{1/2}疎な形式的冪級数の pow であるので、xNx^N までの全ての項が O(N)O(N) 時間で計算できます。あとは 14x2\sqrt{1-4x^2}Y0+Y1x++YNxNY_0 + Y_1x + \cdots + Y_Nx^N との畳み込みを行えば、 A(114x2)A(1 - \sqrt{1-4x^2}) の各項が計算できました。

疎な形式的冪級数のpowを高速に求めるテクニックについては A problem collection of ODE and differential technique (jqdai0815 さん) の「Exp in Gennady Korotkevich Contest 5 By tourist」の節をご覧ください。

最後に、 D(x)A(114x2)D(x) A(1-\sqrt{1-4x^2}) が求める答えです。D(x)=14x212xD(x) = \frac{\sqrt{1-4x^2}}{1-2x}14x2\sqrt{1-4x^2} の累積和を求めるのと同じようにして O(N)O(N) 時間で求められます。その後、 D(x)D(x)14x2\sqrt{1-4x^2} との畳み込みを行えばよいです。以上から、合わせて O(NlogN)O(N \log N) 時間で解けます。

O(Nlog2N)O(N \log^2 N) の方法

漸化式・行列

B(x)B(x) はカタラン数とほぼ同じです。カタラン数の性質を用いることを考えます。カタラン数の母関数 C(x)C(x) について、

xC(x)2=C(x)1x C(x)^2 = C(x) - 1

が成り立ちます。これを用いると、 B(x)=2x2C(x2)B(x) = 2x^2 C(x^2) について

B(x)2=4x4C(x2)2=4x2(C(x2)1)=2B(x)4x2B(x)^2\\ = 4x^4 C(x^2)^2\\ = 4x^2 (C(x^2) - 1)\\ = 2 B(x) - 4x^2

が成り立つことが分かります。求めるべきは

A(B(x))=i=0NAiB(x)i\displaystyle A(B(x)) = \sum_{i=0}^{N} A_i B(x)^i

です。これから、先ほどの漸化式を用い、分割統治を使ってこの式を高速に求めます。

多項式 Pk(x),Qk(x)P_k(x), Q_k(x) を用いて B(x)k=Pk(x)B(x)+Qk(x)B(x)^k = P_k(x) B(x) + Q_k(x) とおくと、

i=0NAiB(x)i=i=0NAi(PiB(x)+Qi)\displaystyle \sum_{i=0}^{N} A_i B(x)^i = \sum_{i=0}^{N} A_i (P_i B(x) + Q_i)

となります。これを高速に求めることができるでしょうか?(Pi,Qi)(P_i, Q_i) の組から (Pi+1,Qi+1)(P_{i+1}, Q_{i+1}) の組への遷移は次のようになります。

B(x)i+1=B(x)B(x)i=B(x)(PiB(x)+Qi)=Pi(2B(x)4x2)+QiB(x)=(2Pi+Qi)B(x)4x2Pi\displaystyle B(x)^{i+1}\\ = B(x) B(x)^i\\ = B(x) (P_i B(x) + Q_i)\\ = P_i (2B(x) - 4x^2) + Q_i B(x)\\ = (2P_i + Q_i) B(x) - 4x^2 P_i

よって、多項式を係数とした行列を用いて

(Pi+1Qi+1)=(214x20)(PiQi)\begin{pmatrix}P_{i+1}\\Q_{i+1}\end{pmatrix} =\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix} \begin{pmatrix}P_{i}\\Q_{i}\end{pmatrix}

と表されます。とくに、

i=0NAiB(x)i=i=0NAi(B(x)1)(214x20)i(01)=(B(x)1)(i=0NAi(214x20)i)(01)\displaystyle \sum_{i=0}^{N} A_i B(x)^i\\ = \sum_{i=0}^{N} A_i \begin{pmatrix}B(x)\\1\end{pmatrix} \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^i \begin{pmatrix}0\\1\end{pmatrix}\\ = \begin{pmatrix}B(x)\\1\end{pmatrix} \left (\sum_{i=0}^{N} A_i \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^i \right) \begin{pmatrix}0\\1\end{pmatrix}

であるため、i=0NAi(214x20)i\displaystyle \sum_{i=0}^{N} A_i \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^i を求めればよいです。

分割統治

f(L,R)=i=LR1Ai(214x20)iL\displaystyle f(L, R) = \sum_{i=L}^{R-1} A_i \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{i-L}

とします。求めるものは f(0,N+1)f(0, N+1) です。

まず、 RL=1R - L = 1 の場合は f(L,R)=(AL00AL)f(L, R) = \begin{pmatrix}A_L&0\\0&A_L\end{pmatrix} です。

そうでない場合、 (L+R)/2=M\lfloor (L+R)/2 \rfloor = M として、f(L,M),f(M,R)f(L, M), f(M, R) が求まったとします。このとき、 f(L,R)f(L, R) が次のように計算できます:

f(L,R)=i=LR1Ai(214x20)iL=i=LM1Ai(214x20)iL+(214x20)MLi=MR1Ai(214x20)iM=f(L,M)+(214x20)MLf(M,R)\displaystyle f(L, R)\\ = \sum_{i=L}^{R-1} A_i \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{i-L}\\ = \sum_{i=L}^{M-1} A_i \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{i-L}+\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{M-L} \sum_{i=M}^{R-1} A_i \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{i-M}\\ = f(L, M) + \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{M-L} f(M, R)

ここで、 (214x20)ML\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{M-L}f(M,R)f(M, R) との畳み込みで O(NlogN)O(N \log N) 時間かかります。

(214x20)ML\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{M-L} については同じく分割統治で求められます。

この分割統治は f(L,R)f(L, R) の統治の部分に O((RL)log(RL))O((R-L) \log(R-L)) 時間かかるので、 f(0,N+1)f(0, N+1) を求めるのに計算量は O(Nlog2N)O(N \log^2 N) 時間かかります。

これで合計 O(Nlog2N)O(N \log^2 N) 時間でこの問題が解けました。

定数倍高速化

このままでは定数倍が重く、C++ であっても通すのが難しいです。しかし、次のような定数倍改善がいくつか考えられ、これらを使って AC を獲得することができます。(1, 2, 3 番目のどれかを用いるのが簡単です)

  • 原点に戻ってくる回数は高々 N/2\lfloor N/2 \rfloor 回であるため、AAA0,,AN/2+1A_0, \cdots, A_{\lfloor N/2 \rfloor + 1} しかないことにしてよい。
  • AA の長さを 22 べき、すなわちある非負整数 kk が存在して AN+1==A2k1=0A_{N+1} = \cdots = A_{2^k-1} = 0 とする。これによって、分割統治の際 (214x20)ML\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{M-L} における MLM-L がすべて 22 べきになる。(214x20)1,(214x20)2,(214x20)4,,(214x20)2i,\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{1}, \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{2}, \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{4}, \cdots, \begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{2^i}, \cdots は分割統治をせずに合計 O(NlogN)O(N \log N) で求めることができる。
  • (214x20)\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix} の代わりに (214x0)\begin{pmatrix}2&1\\-4x&0\end{pmatrix} を用いて計算してよい。後で xxx2x^2 に置き換えれば求めたいものが求まる。
  • 行列積を計算する際、FFT を 88 回行うと butterfly が(inv含めて)合計 1616 回行われるが、butterfly の回数を 88 回に削減することが可能である。AA の長さを 22 べきにすることで、(214x20)2i\begin{pmatrix}2&1\\-4x^2&0\end{pmatrix}^{2^i} の butterfly が再利用でき、さらに定数倍改善することも可能である

O(Nlog2N)O(N \log^2 N) の方法 2

noshi91 さんが2024年3月16日に投稿した記事 FPS の合成と逆関数、冪乗の係数列挙 Θ(n (log(n))^2) で、合成関数を求める操作が O(Nlog2N)O(N \log^2 N) 時間で出来ることが示されています。そして、実際に合成を O(Nlog2N)O(N \log^2 N) 時間で行うアルゴリズムによって、この問題を AC できます。

O(Nlog2N)O(N \log^2 N) の方法 3

noshi91 さんが2024年3月16日に投稿した記事 FPS の合成と逆関数、冪乗の係数列挙 Θ(n (log(n))^2) と同じ方法で、固定された kk に対して [xk]a(x)b(x)i[x^k] a(x) b(x)^i をすべての 0i<n0 \le i \lt n に対して列挙することが O(nlog2n+klog2k)O(n \log^2 n + k\log^2 k) 時間で可能です。 22 変数形式的冪級数 FyxF\llbracket y \rrbracket \llbracket x \rrbracket において [xk]a(x)1yb(x)\displaystyle [x^k] \frac{a(x)}{1-yb(x)}yny^n 次までを求めればよく、bostan-mori 法を用いて求められます。(詳しくは記事をご覧ください)

今回、求めたいものは

[xN]D(x)A(B(x))=i=0NAiD(x)B(x)i\displaystyle [x^N] D(x) A(B(x))\\ = \sum_{i=0}^N A_i D(x) B(x)^i

でした。よって、[xN]D(x)1yB(x)\displaystyle [x^N] \frac{D(x)}{1-yB(x)}yNy^N まで求めればこの問題を O(Nlog2N)O(N \log^2 N) 時間で解くことができます。

定数倍高速化

この方法だと定数倍が重く、実行時間制限に間に合わない可能性があります。そこで、次の ad-hoc な定数倍高速化が考えられます。やることは bostan-mori 法の一部分とほとんど同じです。

  • この問題の場合、 B(x)B(x) は偶関数であるので、 B(x)=V(x2)B(x) = V(x^2) となる形式的冪級数 VV が存在する。また、 D(x)D(x)22 つの偶関数 De(x2),Do(x2)D_e(x^2), D_o(x^2) に分け、 D(x)=De(x2)+xDo(x2)D(x) = D_e(x^2) + xD_o(x^2) とおく。このとき

[xN]D(x)1yB(x)=[xN]De(x2)+xDo(x2)1yV(x2)={[xN]De(x2)1yV(x2)(Nは偶数)[xN]xDo(x2)1yV(x2)(Nは奇数)={[xN/2]De(x)1yV(x)(Nは偶数)[x(N1)/2]Do(x)1yV(x)(Nは奇数)\displaystyle [x^N] \frac{D(x)}{1-yB(x)} \\ = [x^N] \frac{D_e(x^2) + xD_o(x^2)}{1-y V(x^2)}\\ = \begin{cases} [x^N] \frac{D_e(x^2)}{1-y V(x^2)} & (N は偶数)\\ [x^N] \frac{x D_o(x^2)}{1-y V(x^2)} & (N は奇数) \end{cases}\\ = \begin{cases} [x^{N/2}] \frac{D_e(x)}{1-y V(x)} & (N は偶数)\\ [x^{(N-1)/2}] \frac{D_o(x)}{1-y V(x)} & (N は奇数) \end{cases}

が成り立つ。また、実際には yyyN/2y^{N/2} 程度までしか列挙する必要がない。最初にこの処理をしておくと、 22 倍以上の定数倍高速化となる。