スターリング数のような設定(ボールは区別できる、箱は区別できない、各箱に1つ以上のボールが入る)の数え上げはスターリング数のようなDPができる、という典型を思い出す。
とりあえずスターリング数と同じようにを個のグループにわける場合の数、と定める。の場合はスターリング数と同じような遷移[1] が成立しそうだが、だとの所属するグループに関する未来の情報が必要でうまくいかない。DPするにはもう少し変数を増やす必要がある。
与えられるのは順列なので巡回置換に分解してみる。整数の順序は関係ないので、のように各巡回置換が連続区間に対応しているものだけ考えればよい。このとき、を次のように定義すればDPできる:
を個のグループにわけるとして、がの属する巡回置換の先頭の整数と同じグループに属するか異なるグループに属する場合の数。
遷移の意味付けはdrkenさんの記事を参照。 ↩︎