包除原理の基礎的な話
はじめに
包除原理を知っていますか? 私は知っています
知ってはいますが, 全然使いこなせていないし使うたびに頭が壊れてしまって 「答えが合ったので, ヨシ!!」と提出してしまうので, ちゃんと勉強しようと思いました
この記事はそのまとめです
本文
とりあえずググりましょう
一番上に wikipedia 先生が出てきたので開いてみると, このような式が乗っています
複雑そうに見えるかもしれませんが, 「積集合をいい感じに足し引きすると和集合になる」というだけです
証明はいつもお世話になっております 高校数学の美しい物語 さんを見るといいでしょう
この式を見ればわかる通り, これは 積集合 から 和集合 を求めています
つまり, ある集合 を決め打ったときに「少なくとも
を含む場合」が簡単にわかるときに「少なくとも一つを含む場合」 を 求めようとしています
また, の上位集合を
とすると
と書けます ( 個の積集合 = 上位集合全体 と考えています)
これは 元の式の余事象なので, 「一つも含まない場合」を意味します
ここまで集合の形で書きましたが, 競プロではだいたいこのままの形では出ません
競プロの問題文を要約すると, たいていの場合
いくつかの条件が与えられる これらをすべて満たすようなものが何通りあるか求めよ
みたいな感じになります
このせいで, 「なんか包除するのかな~」という気持ちになっても 「条件のうち, これとこれは満たすもの を足し合わせて... ?」 となって混乱してしまいます (僕だけですか?)
上に書いた通り, 包除原理で求めることができるのは 和集合 です
「すべて満たすようなもの」というのは 積集合 なのでこのままでは求められません
そのため, 逆に 「条件を満たさないもの」を考えます
つまり,
いくつかの条件が与えられる これらに一つも違反していないものは何通りあるか求めよ
という感じに言い換えるわけです
すると, この「これらに一つも違反していないもの」は 「少なくともこれとこれは違反するような方法は何通りあるか」のようなものが求められれば包除原理で求められるわけです
おわりに
個人的に, この「条件を満たさないものを考える」というのがとても非直感的だな と感じてしまうため, いつも思考が妨げられていました
こうやってちゃんと考えて少しずつ慣れていけたらな と思います