naruの日記

いい記事を書きます。あと、日記ではないです。

包除原理について考える

ABC172のE問題は次のような問題であった。

1以上M以下の整数からなる長さNの数列 A_1,A_2,\ldots ,A_NB_1,B_2,\ldots,B_Nの組であって、以下の条件をすべて満たすものの個数を求めてください。

  • 1\leq i\leq Nなる任意のiについて A_i\neq B_i
  • 1 \leq i < j \leq Nなる任意の (i,j)について A_i\neq A_jかつ B_i\neq B_j

ただし、答えは非常に大きくなる可能性があるので、(10^9+7)で割ったあまりを出力してください。

この問題を考えてみたが煮詰まってしまい、泣きながら解答を見ると包除原理を利用した解法が載っていた。
解答には大まかに以下のような説明が載っていた。

各要素が1以上N以下の整数である集合Sについて「i \in Sなる全てのiについてA_i = B_i」が成り立つA,Bの組の個数は{}_M P_{|S|}\times \left( {}_{M-|S|}P_{N-|S|}\right)^2である。
包除原理より、上の個数に(-1)^{|S|}をかけた(-1)^{|S|}\times {}_M P_{|S|}\times \left( {}_{M-|S|}P_{N-|S|}\right)^2の全てのSに対して総和をとったものが答えになる。

止まりなさい。完全にスピード違反である。

私の知っている包除原理は次のようなものである。

集合X_i\,(i=1,\ldots n)の和集合の元の個数は以下で表される。

\begin{align*}
\left|\bigcup_{i=1}^n X_i\right|&=\sum_{i}|X_i|-\sum_{i < j}\left|X_i\cap X_j\right| +\cdots + (-1)^{n-1}\left|X_1\cap \cdots \cap X_n\right|\\
&=\sum_{I \subset \{1,2,\ldots , n\},I\neq \varnothing} (-1)^{|I|-1} \left|\bigcap_{i \in I} X_i\right|
\end{align*}

包除原理をこの問題に対応させてみる。
X_Sを「i\in Sなるi全てについてA_i=B_iが成り立つA,Bの組の集合」として定義する。
このときS_1,S_2 \subset \{1,2,\ldots ,N\}についてS_1\cap S_2=Sが成り立つとき、X_{S_1}\cap X_{S_2} =X_{S}も成り立つ。
ここで、「1 \leq i \leq Nに少なくとも一つA_i=B_iを満たすiが存在する」ようなA,Bの組の個数を考えると、それは上の包除定理の式にあてはめて、以下のように表せる。

\begin{align*}
\left|\bigcup_{|S|=1} X_S\right|&=\left|\bigcup_{i=1}^N X_{\{i\}}\right|\\
&=\sum_{I\subset \{1,2,\ldots ,N\},I\neq \varnothing} (-1)^{|I|-1} \left|\bigcap_{i\in I} X_{\{i\}}\right|\\
&=\sum_{S\subset\{1,2,\ldots ,N\},S\neq \varnothing} (-1)^{|S|-1} |X_S| & \left(\because \bigcap_{i\in S} X_{\{i\}} =X_S\right)
\end{align*}

ここで、「1 \leq i \leq Nなる全てのiA_i\neq B_iが成り立つ」ようなA,Bの組の集合は上で考えた集合の補集合になっている。よって、今計算した結果を用いて答えを求められそうだ。
全体集合の元の個数は|X_\varnothing|(A,Bの並べ方になんの制約もないときの組の個数)と表せるので、求める個数は

\begin{align*}
\left|X_\varnothing \right|-\left|\bigcup_{|S|=1} X_S\right|&=\left|X_\varnothing \right|+\sum_{S\subset\{1,2,\ldots ,N\},S\neq \varnothing} (-1)^{|S|} |X_S|\\
&=\sum_{S\subset\{1,2,\ldots ,N\}} (-1)^{|S|} |X_S|
\end{align*}

このように数式を変形させていくと、確かに求める個数が(-1)^{|S|}\times {}_M P_{|S|}\times \left( {}_{M-|S|}P_{N-|S|}\right)^2の総和で表されるという結果になった。

なんだかなぁ*1

おそらくもっと直感的に理解できる内容であるはずだが数式でこねくり回してしまった。

まあ一応納得はしたので良しとしよう。

*1:阿藤快にリスペクトを