AtCoder Beginner Contest 180 F - Unbranched
各連結成分のサイズの最大値がちょうどという条件なので、最大値が以下の場合の数から最大値が以下の場合の数を引くことを考える。
を「サイズ以下の連結成分の集合で、頂点数が個、辺の数が本であるときの場合の数」とする。これに個の残りの頂点から点を追加していく遷移を考える。頂点の次数が2以下であるということは、各連結成分はループまたはパスになっている。そのため、素直に考えると個の点を新たに追加するときはパスの場合、ループの場合となる(ただし、の場合は別に考える)。しかし、この方針だと連結成分同士の順列の分の重複を考える必要が出てくるため、dpの状態として連結成分の状態を保つ必要があり、とかになってしまう。
そのため、個の新規に追加する頂点のうち1個は残りの頂点のうち最小のインデックスを持つ頂点にする、という制約を加える(他の頂点はなんでもよい)。すると連結成分同士の順列を考えなくて良くなる。この場合、パスの場合、ループの場合となる(同様にの場合は別に考える)。これは素直に書くとになり間に合う。