2021年11月16日火曜日

ABC 226 F - Score of Permutations

F(M)=F(M) =長さNNの順列で、すべてのサイクルの長さがMMの約数であるようなものの数 f(m)=f(m)=長さNNの順列で、サイクルの長さのLCMがmmであるようなものの数

とするとき、求める数はNNの分割のLCMとして得られるようなすべてのmmについてf(m)mKf(m)m^Kの総和を取ったものに等しい。

F(M)=mMf(m)F(M) = \sum_{m | M} f(m)であり、ffFFのメビウス反転として計算できる。また、NNの分割のLCMの最大値はランダウ関数g(N)g(N)として知られていて、OEISによるとg(50)=180180g(50) = 180180なので、個々のF(M)F(M)を高速に計算できればよさそう。

F(M)F(M)は単純なDPで求まる。dp[x]=1,2,...,N\operatorname{dp}[x] = 1, 2, ..., Nからxx個使って任意個数の長さがMMの約数であるようなサイクルを作る場合の数、とするとき、MMの各約数m(N)m ( \le N)について

dp[x+m]+=(m1)!(Nx1m1)dp[x] \operatorname{dp}[x+m] \mathrm{{+}{=}} (m-1)! \binom{N-x-1}{m-1}\operatorname{dp}[x]

と遷移すればよい。(m1)!(m-1)!は長さmmのサイクルの総数であり、(Nx1m1)\binom{N-x-1}{m-1}はまだ使っていないNxN-x個の数から(完全な数え上げをするために)必ず最小の数は選ぶとして残りのm1m-1個を自由に選ぶことに対応している。計算量はO((N2+logK)g(N)){O}((N^2 +\log K)g(N))[1]

また、FPSで考えることもできる。MMの約数だけに限って各長さのサイクルの総数を数えたEGFをDM(x)\mathcal D_M(x)とするとき、DM(x)=mM(m1)!xm/m!=mMxm/m\mathcal D_M(x)=\sum_{m | M}(m-1)!x^m/m! = \sum_{m|M}x^m/mである。このとき、F(M)=[xN/N!]exp(DM(x))F(M) = [x^N/N!]\exp(\mathcal D_M(x))である。[2] FFTを使うと計算量はO((NlogN+logK)g(N)){O}((N\log N + \log K) g(N))


解説を見ると、LCMごとにまとめなくてもすべての分割を試せるらしい。確かに。


  1. 実際には1,2,...,g(N)1, 2, ..., g(N)の約数でNN以下であるものの総数が問題になる。これがo(N2){o}(N^2)であればもっとよい評価ができることになるけれど、よくわからなかった。 ↩︎

  2. 仮に「箱」が区別できる設定だったら単にEGFの掛け算をすればいいので[xn/n!]n1DM(x)n[x^n/n!]\sum_{n \ge 1}\mathcal D_M(x)^nでよくて、箱の区別を無くすために各項をn!n!で割るとn1DM(x)n/n!=exp(DM(x))\sum_{n \ge 1}\mathcal D_M(x)^n/n! = \exp(\mathcal D_M(x))になる。 ↩︎

2021年11月9日火曜日

ACL Beginner Contest F - Heights and Pairs

hih_iが互いに異なる場合は(2N1)!!=(2N)!/2NN!(2N-1)!! = (2N)! / 2^N N!通りという有名事実がある(後述)。以下、pi=(2i1)!!p_i = (2i-1)!!とする。

身長hhの人がaha_h人いるとする。ii人の同じ身長を持つ人からjjペアを作る場合の数は(i2j)pj\binom{i}{2j}p_jである。F(x)=hj(ah2j)pjxjF(x) = \prod_h \sum_j \binom{a_h}{2j}p_j x^{j}とすると、F(x)F(x)xkx^kの係数[xk]F(x)[x^k]F(x)2N2N人から身長が同じであるようなkkペアを作る場合の数に等しい。このとき、残った人、つまり2(Nk)2(N-k)人でペアを作る場合の数はpNkp_{N-k}通りであり、あとは包除でk(1)kpNk([xk]F(x))\sum_k(-1)^kp_{N-k}([x^k]F(x))通りと求まる。

(2N1)!!(2N-1)!!について

2N2N人に1,2,...,2N1, 2, ..., 2Nという番号を振ってこの順に並べ、二人ずつ取り除いていくとする。この際、ペアのうちの一人目は必ずその時点で番号が最小の人を選ぶ、としておくと完全な数え上げができる。一人目には2N12N-1通りの人がマッチできて、二人目には2N32N-3通りの人がマッチできて、……となるので二重階乗の記号を使うと(2N1)!!(2N-1)!!と表せる。

別の考え方もできる。2N2N人を自由な順番で一列に並べて、隣り合う二人をくっつけてNNペアを作ることにする。並べ方は(2N)!(2N)!通りあるが、二人組の内の順番は考慮しないので2N2^Nで割る必要がある。さらに、NNペアの順番も考慮しないのでN!N!で割って(2N)!/(2NN!)(2N)!/(2^N N!)と求まる。これらは二重階乗の公式も与えている:

(2N1)!!=(2N)!2NN! (2N-1)!! = \frac{(2N)!}{2^N N!}

2021年11月7日日曜日

エイシング プログラミングコンテスト 2020 F - Two Snuke

2(s1+n1+u1+k1+e1)+Δs+Δn+Δu+Δk+ΔeN2(s_1+n_1+u_1+k_1+e_1)+\Delta s + \Delta n + \Delta u + \Delta k + \Delta e \le Nで各変数は非負という条件下でΔsΔnΔuΔkΔe\Delta s\Delta n\Delta u\Delta k\Delta eの総和を取る問題。

d=N(Δs+Δn+Δu+Δk+Δe)d = N - (\Delta s + \Delta n + \Delta u + \Delta k + \Delta e )とするとき、ΔsΔnΔuΔkΔe\Delta s\Delta n\Delta u\Delta k\Delta es1+n1+u1+k1+e1d/2s_1+n_1+u_1+k_1+e_1 \le d/2の非負整数解の数だけ足される。これは(d/2)+55)\binom{\lfloor d/2 \rfloor)+5}{5}通りだから、求める数は

d1+d2+d3+d4+d5+d=N(d/2+55)d1d2d3d4d5 \sum_{d_1+d_2+d_3+d_4+d_5 + d = N}\binom{\lfloor d/2 \rfloor+5}{5}d_1d_2d_3d_4d_5

に等しい。FPSで考えるなら、nnxn=x/(1x)2\sum_n nx^n = x/(1-x)^2を5乗してi(i/2+55)xi\sum_{i} \binom{\lfloor i/2 \rfloor +5}{5}x^{i}という謎の級数を掛けると、xNx^Nの係数が求める数である。後者にBerlekamp-Massey法を適用してみると21次の多項式を分母とする有理式が出てくるので、xNx^Nの係数はBostan-Mori法で求まる。


そもそも一般にi/2\lfloor i/2 \rfloorの多項式を係数にするFPSが有理べき級数になるのかどうかとか、基本的なことがよくわかっていなかった。

与えられたFPSf(x)f(x)の偶数項、奇数項がそれぞれ有理べき級数g(x),h(x)g(x), h(x)の偶数項、奇数項と一致しているなら、ggの(0-basedで)偶数項だけ抜き出したもの(g(x)+g(x))/2(g(x)+g(-x))/2hhの奇数項だけ抜き出したもの(h(x)h(x))/2(h(x)-h(-x))/2を足せばf(x)f(x)になるので、確かに有理べき級数になる。一般にi/k\lfloor i/k \rfloorの多項式を係数とするFPSについても、11kk乗根を考えれば同じことが言える。

一般化すると、次の性質を満たすf(x)=nanxnf(x) = \sum_n a_n x^nは有理べき級数と言える:

MM個の有理べき級数fk(x)=nbk,nxn (k=0,1,...,M1)f_k(x) = \sum_n b_{k, n}x^n \ (k=0, 1, ..., M-1)NNN \in \mathbb Nが存在して、nNn \ge Nならばan=bnmodM,na_n = b_{n \bmod M, n}