Editorial
ある数列PについてPi=i番目の人がもらった手紙の番号としたとき、この問題で求めるものは以下のように言い換えることができます。
- 1つ以上のi (1≤i≤N)についてPi=iなる要素が存在する場合の数
これを直接考えるのはとても面倒なので余事象を考えてみます。
- 数列Pの任意のiについてPi=iが成り立つ場合の数
ここで「i番目の手紙は人iに届くはずだった。」ということから数列Pの中には1,2,...,Nまでの数字が1つずつ存在することを考えると数列Pは順列であることがわかります。
したがって余事象は
と言い換えることができます。
長さNの完全順列の個数をanと置くとN=1のときa1=0, N=2のときa2=1, N≥3のときan=(n−1)(an−1+an−2)として求めることが可能です。(モンモール数)
また、長さNの順列の総数はN!です。
したがって、求める答えはN!−anです。
N!とanはそれぞれO(N)で求めることができるので、この問題をO(N)で解くことができました。
実装例(C++)
実装例(Python)