鹿島建設プログラミングコンテスト2020 (ARC110) の D 問題を形式的冪級数を使って解く
これは鹿島建設プログラミングコンテスト2020 (ARC110) の D 問題を形式的冪級数を使って解くためのメモ
問題
形式的冪級数を使って解く
サーバル「D問題は……えーっと、最近はやってる形式的べき級数ってやつででFi(X)=ΣC(k,Ai)X^kとするとΠFiのk次の係数が「和がkのとき」の答えになって、Fi=X^Ai/(1-X)^(Ai+1)だから頑張って計算するとC(N+M,N+ΣAi)になることがわかるよ!!」
— 競技プログラミングをするフレンズ (@kyopro_friends) December 5, 2020
kyopro_friends さんのこの(↑)ツイートを参考にする。ツイートで述べられているように
とおくと、 の の係数が のときの答えとなっている。
この記事 より、数列 の母関数は
であって、これを使うと は次のように整理できる。
求める答えは の の係数の和だから
となる。第 2 式から 第 3 式への変形では次の関係を使った。
これは数学的帰納法や WolframAlpha を使うことで証明できる。また、この式が正しいことはパスカルの三角形からも読み取ることができる。
[追記]
maspy さんのブログ を読むと の の係数の和は上の関係式を使わなくても求められることが分かる。
数列 に対して とおいて、これらの母関数を
とおく。ここで、
が成り立つことから、
という関係が得られる。つまり、数列 の累積和 の母関数は数列 の母関数を で割るだけで得られる!(すごい)
この事実をつかうと、求める答えは の の係数ということになるから
より、
感想
FPS 強ぇ~~
使えるようになりたいね。
[追記]