F(M)=長さNの順列で、すべてのサイクルの長さがMの約数であるようなものの数
f(m)=長さNの順列で、サイクルの長さのLCMがmであるようなものの数
とするとき、求める数はNの分割のLCMとして得られるようなすべてのmについてf(m)mKの総和を取ったものに等しい。
F(M)=∑m∣Mf(m)であり、fはFのメビウス反転として計算できる。また、Nの分割のLCMの最大値はランダウ関数g(N)として知られていて、OEISによるとg(50)=180180なので、個々のF(M)を高速に計算できればよさそう。
F(M)は単純なDPで求まる。dp[x]=1,2,...,Nからx個使って任意個数の長さがMの約数であるようなサイクルを作る場合の数、とするとき、Mの各約数m(≤N)について
dp[x+m]+=(m−1)!(m−1N−x−1)dp[x]
と遷移すればよい。(m−1)!は長さmのサイクルの総数であり、(m−1N−x−1)はまだ使っていないN−x個の数から(完全な数え上げをするために)必ず最小の数は選ぶとして残りのm−1個を自由に選ぶことに対応している。計算量はO((N2+logK)g(N))。
また、FPSで考えることもできる。Mの約数だけに限って各長さのサイクルの総数を数えたEGFをDM(x)とするとき、DM(x)=∑m∣M(m−1)!xm/m!=∑m∣Mxm/mである。このとき、F(M)=[xN/N!]exp(DM(x))である。 FFTを使うと計算量はO((NlogN+logK)g(N))。
解説を見ると、LCMごとにまとめなくてもすべての分割を試せるらしい。確かに。