Official

H - Next Permutation Editorial by toam


\(N\) の順列のうち,辞書順で \(P\) が(0-indexed で(以下同様)) \(x\) 番目に, \(Q\)\(y\) 番目に小さいとします.このとき,求める順列は \((y-x\pmod{N!})\) 番目に小さい順列です.

ここで,正整数 \(K\) を階乗進数表示すると,辞書順で \(K\) 番目に小さい順列を求めることができます.逆に,順列が辞書順で \(K\) 番目に小さいとすると,順列から階乗進数表示された \(K\) も求めることができます.

変換方法 $N=5$ において,$23110_{(!)}$ 番目に小さい順列 $P$ は次の手順によって求められます.
  • $\lbrace 1,2,3,4,5\rbrace$ の中で(0-indexed で) $2$ 番目に小さいものは $3$ より $P_1=3$
  • $\lbrace 1,2,4,5\rbrace$ の中で $3$ 番目に小さいものは $5$ より $P_2=5$
  • $\lbrace 1,2,4\rbrace$ の中で $1$ 番目に小さいものは $2$ より $P_3=2$
  • $\lbrace 1,4\rbrace$ の中で 1$$ 番目に小さいものは $4$ より $P_4=4$
  • $\lbrace 1\rbrace$ の中で $0$ 番目に小さいものは $1$ より $P_5=1$
  • 以上により $P=(3,5,2,4,1)$ である.
逆に,順列 $P=(3,5,2,4,1)$ が $K$ 番目に小さい順列であるとき,$K$ を階乗進数表示する方法は次の手順によって求められます.
  • $\lbrace 1,2,3,4,5\rbrace$ の中で $3$ は(0-indexed で) $2$ 番目に小さいから,$K$ の $4!$ の位の数字は $2$
  • $\lbrace 1,2,4,5\rbrace$ の中で $5$ は $3$ 番目に小さいから,$K$ の $3!$ の位の数字は $3$
  • $\lbrace 1,2,4\rbrace$ の中で $2$ は $1$ 番目に小さいから,$K$ の $2!$ の位の数字は $1$
  • $\lbrace 1,4\rbrace$ の中で $4$ は $1$ 番目に小さいから,$K$ の $1!$ の位の数字は $1$
  • $\lbrace 1\rbrace$ の中で $1$ は $0$ 番目に小さいから,$K$ の $0!$ の位の数字は $0$
  • 以上により $K=23110_{(!)}$ である.

さらに,階乗進数表示された \(2\) つの数の加算を階乗進数表示上で行うこともできます(通常の筆算と同様に下の桁から計算すればよいです).

よって,以下の手順で答えを求めればよいです.

  • \(N!-x\) を階乗進数で求める(これは, \(N!-x-1\) 番目に小さい順列は \(R_i=N+1-P_i\) として得られる順列 \(R\) であることを利用して求められる).
  • \(y\) を階乗進数で求める.
  • \(y-x \pmod{N!}\) を階乗進数で求める.
  • \((y-x \pmod{N!})\) 番目に小さい順列を求める.

順列を階乗進数に変換したり,階乗進数を順列に変換するためには,集合に対して

  • 要素の追加・削除
  • 集合の要素のうち \(k\) 番目に小さい要素を求める
  • 集合のある要素が集合の中で何番目に小さいかを求める

が高速にできるデータ構造があればよく,これは fenwick tree などを用いて行えます.計算量は \(O(N \log N)\) です.

posted:
last update: