2020年10月17日土曜日

ABC 180 F - Unbranched

「最大サイズがちょうどLL」の代わりに、f(n,m,l):=f(n, m, l) :=連結成分のサイズがllを超えないnn頂点mm辺のグラフの数、を数えることにして、f(N,M,L)f(N,M,L1)f(N, M, L)-f(N, M, L-1)を答えとすればよい。

次数2以下の連結成分はパスかサイクルしかないので、この2つを作りながら数えていくDPができそうだが、頂点の順番をどうするかが問題になる。順番を固定した上で最後に定数を掛けるのはうまくいかなそうだし、固定せずに挿入していくDPもサイズの上限に関する制約を扱うのが困難に見える。

こういう時の典型テクニックの一つとして、「選ぶ頂点の一つは、残っているものの中でもっとも小さい番号とする」というルールを追加してグループ(この場合は連結成分)を作っていくというものがある。この場合はこれがうまくいきそうだ。

dp[x][y]:=\operatorname{dp}[x][y] :=頂点をxx個、辺をyy個使ってできる(条件を満たす)グラフの総数

とする。残ったNxN-x個の頂点からサイズssのパスグラフを作る時、連結成分のうちの1つの頂点は残った頂点の中でもっとも番号の小さいものと決めているので、残りはNx1N-x-1個からs1s-1個を選ぶことになる。ラベル付きパスグラフの総数はs!/2s!/2(ただしs=1s=1の場合は例外)なので、

dp[x+s][x+s1]+=s!2(Nx1s1)dp[x][y] \operatorname{dp}[x+s][x+s-1] \mathrel{{+}{=}} \frac{s!}{2} \binom{N-x-1}{s-1} \operatorname{dp}[x][y]

と遷移できる。サイクルを作る場合も同様で、ラベル付きサイクルグラフの総数は(s1)!/2(s-1)!/2(ただしs2s\le 2の場合は例外)なので、

dp[x+s][x+s1]+=(s1)!2(Nx1s1)dp[x][y] \operatorname{dp}[x+s][x+s-1] \mathrel{{+}{=}} \frac{(s-1)!}{2} \binom{N-x-1}{s-1} \operatorname{dp}[x][y]

と遷移する。ただし、自己ループであるs=1s=1は許されないことに注意。