DivineJK’s diary

Z cjikf c evf'

ABC180F - Unbranchedを形式的冪級数を使って解く

形式的冪級数FPS)でやる解法で解いたので、まとめてみます。

問題リンク↓

atcoder.jp

考察

グラフに課される条件のうち、最初の2つの条件

  • 自己ループを持たない
  • すべての頂点の次数が 2以下である

から、考えるべきグラフは直線グラフか頂点数2以上のサイクル(を集めたもの)です。そして、3つめの条件

  • 各連結成分のサイズを並べたとき、その最大値がちょうど Lである

についてですが、典型知識として、最大値がちょうど Lのものの数え上げは、(最大値が L以下であるものの個数)-(最大値が L-1以下であるものの個数)を求めれば良いです。ここまでは公式解説の通りです。

条件を満たすグラフで、連結成分のサイズの最大値が L以下であるものについて考えます。まずは、各連結成分のサイズの振り分け方を決めます。サイズ i(1\le i \le L)の直線グラフの個数を x _ {i}、サイズ i(1\le i \le L)のサイクルの個数を y _ {i}とおくと、頂点数と辺の数の条件から、

 \sum ^ {L} _ {i = 1}ix _ {i} + \sum ^ {L} _ {i = 2}iy _ {i} = N, \quad \sum ^ {L} _ {i = 1}(i - 1)x _ {i} + \sum ^ {L} _ {i = 2}iy _ {i} = M

という関係があります。この2式を整理して、

 \sum ^ {L} _ {i = 1}ix _ {i} + \sum ^ {L} _ {i = 2}iy _ {i} = N, \quad \sum ^ {L} _ {i = 1}x _ {i} = N - M

としておきます。

次に、各連結成分の頂点に番号を振ることを考えましょう。サイズ iの直線グラフの各頂点に与える番号を i個とってきます。これらを各頂点に並べる方法は、反転して同じになるものを考慮して i\ge 2のとき i!/2通り、 i = 1のとき 1通り、 i\le 0のとき 0通りです。これを一般に f _ {1}(i)とおきます。

サイクルについても同様に、 i\ge 3のとき (i-1)!/2通り、 i = 2のとき 1通り、 i\le 1のとき 0通りです。これを一般に f _ {2}(i)とおきます。

さらに、辺にラベルがついてないことから、同じ頂点数、同じタイプの連結成分は区別しません。これをふまえて、求める個数は

 N!\sum \prod ^ {L} _ {i=0}\prod ^ {L} _ {j=0}\dfrac{\{f _ 1(i)\}^{x _ i}}{x _ {i}!(i!)^{x _ {i}}}\dfrac{\{f _ 2(j)\}^{y _ j}}{y _ {j}!(j!)^{y _ {j}}}

です。和の範囲は x _ {i}, y _ {j}が先ほどの条件を満たすようにとります。

形式的冪級数を使う

さて、この和の中にある積の部分ですが、なにか見覚えがないでしょうか?そうですね、expの級数展開の項に出てくるやつですね。以下のものを考えます。

 \sum \prod ^ {L} _ {i=0}\prod ^ {L} _ {j=0}\dfrac{\{f _ 1(i)X ^ {i}Y\}^{x _ i}}{x _ {i}!(i!)^{x _ {i}}}\dfrac{\{f _ 2(j)X ^ {j}\}^{y _ j}}{y _ {j}!(j!)^{y _ {j}}}

これの X, Yの指数は、それぞれ条件より N, N - Mとなります。そしてこれは、

 \prod ^ {L} _ {i=0}\prod ^ {L} _ {j=0}\left(\sum ^ {\infty} _ {k=0}\dfrac{1}{k!}\left(\dfrac{f _ 1(i)X^{i}Y}{i!}\right)^k\right)\left(\sum ^ {\infty} _ {k=0}\dfrac{1}{k!}\left(\dfrac{f _ 2(j)X^{j}}{j!}\right)^k\right)

 X^{N}Y^{N-M}の項にあたります。それぞれの級数はまさにexpの形そのものなので、それを用いて整理すると、

 \exp\left(Y\sum ^ {L} _ {i=0}\dfrac{f _ 1(i)X^{i}}{i!} + \sum ^ {L} _ {i=0}\dfrac{f _ 2(i)X^{i}}{i!}\right)

というとてもすっきりした形になります。これの X^{N}Y^{N-M}の項を求めたいのですが、変数が2つあると複雑なので、偏微分的な要領で Xを定数とみなして Y^{N-M}の項を求めましょう。exp型なので、この場合は Y N-M偏微分すれば良いです。結局、

 \dfrac{1}{(N-M)!}\left(\sum ^ {L} _ {i=0}\dfrac{f _ 1(i)X^{i}}{i!}\right)^{N-M}\exp\left(\sum ^ {L} _ {i=0}\dfrac{f _ 2(i)X^{i}}{i!}\right)

 X^{N}の項を求めればよいことになります。これを L-1でも同様に行い、その結果を Lのときの結果から引けば答えが求められます。

 \bmod 10^{9} + 7ですが、 N, M, Lが小さいことと、形式的冪級数の逆数などが登場しないことから、FPSのライブラリを持ち出さずにexpの冪級数展開を用いて計算したりしても間に合います。