輪郭をなぞるだけのブログ

浅学菲才のためにおそらく嘘も多い

包除原理に関するメモ

余事象を考えて包除原理を用いる問題に出会う度、理解に時間がかかるのでメモ。

「すべて~ない」などの条件をもった場合の数を直接求めるのは難しく、否定の条件を考えて余事象で求めることがある。
例えば、求める条件が任意の i に対して a_{i}\neq i であるというときに a_{i}=i という条件を考える、など。
否定の条件を禁止事項と呼ぶことにする。
E - NEQF - Heights and Pairs のように、禁止事項の個数で状態がまとめられるとき、少なくとも k 個禁止事項を持つ集合を S_{k} (要素数 : |S_{k}|) とする。
S_{k} に関して重要なのは、禁止事項以外は自由に決められるので k 個より多く禁止事項を持つ可能性がある。(このおかげで数えやすい。)
また、全事象は禁止事項 0 個以上とも取れるので S_{0} である。
求める場合の数は全事象から禁止事項を持つ場合の数を引いたものであるので、禁止事項の個数の上限を N とすると、
|S_{0}| - |\bigcup_{k=1}^{N}S_{k}|
= |S_{0}| - \sum_{k=1}^{N}(-1)^{k-1}|S_{k}| (∵包除原理)
= |S_{0}| + \sum_{k=1}^{N}(-1)^{k}|S_{k}|
= \sum_{k=0}^{N}(-1)^{k}|S_{k}|
と表せる。

アルゴリズムの簡単なまとめ Wiki - yukicoder にあるように、
\bigcap\overline{S} = \overline{\bigcup{S}}
と捉えるのは簡潔ですごい。
ただ、自分は S_{0} まわりをどう捉えればいいか分からなくなってしまったので、ひとまず前述の形で理解することにした。