library_for_python

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Kazun1998/library_for_python

:heavy_check_mark: Montmort Number
(Sequence/Montmort_Number.py)

Theory

$N$ を正の整数とする. $\sigma \in \mathfrak{S}_N$ が以下を満たす時, $\sigma$ を撹乱順列 (完全順列) という.

$\mathfrak{S}_N$ にある撹乱順列の個数を $M_N$ と書く. このとき, $M_N$ は次の式で表される.

\[M_N=\begin{cases} 0 & (N=1) \\ 1 & (N=2) \\ (N-1)(M_{N-1}+M_{N-2}) & (N \geq 3) \end{cases}\]

実際, $N=1,2$ の時は簡単に確かめる事ができる. $N \geq 3$ のとき, 撹乱順列 $\sigma \in \mathfrak{S}_N$ において, $k:=\sigma(1)$ として, $\sigma(k)$ の値で場合分けをする.

よって, $\sigma(1)=k$ となるような攪乱順列の個数は $(M_{N-1}+M_{N-2})$ 個であり, $k=2,3, \dots, N$ の場合を考えることによって,

\[M_N=(N-1)(M_{N-1}+M_{N-2})\]

となる.

また, この漸化式を変形すると,

\[M_N-N M_{N-1}=-(M_{N-1}-(N-1) M_{N-2})\]

である. よって,

\[\begin{align*} M_{N}-N M_{N-1} &=-(M_{N-1}-(N-1) M_{N-2}) \\ &=(-1)^2 (M_{N-2}-(N-2) M_{N-3}) \\ &=\vdots \\ &=(-1)^{N-2} (M_{2}-2M_{1})\\ &=(-1)^N (1-2 \times 0) \\ &=(-1)^N \end{align*}\]

であるから, $(M_N)$ は二項間漸化式

\[M_N=\begin{cases} 0 & (N=1) \\ NM_{N-1}+(-1)^N & (N \geq 2) \end{cases}\]

ともなる.

Verified with

Code

def Montmort_Number(N, Mod=None):
    """ k=0,1,...,N に関して, k 要素撹乱順列の個数を求める.
    """
    if N<0:
        return []
    elif N==0:
        return [0]

    X=[0]*(N+1)
    if Mod==None:
        for k in range(2, N+1):
            X[k]=k*X[k-1]+(-1 if k%2 else 1)
    else:
        for k in range(2, N+1):
            X[k]=(k*X[k-1]+(-1 if k%2 else 1))%Mod

    return X
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
    bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
                   ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/hostedtoolcache/Python/3.13.3/x64/lib/python3.13/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
    raise NotImplementedError
NotImplementedError
Back to top page