包除原理について考える
ABC172のE問題は次のような問題であった。
以上以下の整数からなる長さの数列 との組であって、以下の条件をすべて満たすものの個数を求めてください。
- なる任意のについて
- なる任意の について かつ
ただし、答えは非常に大きくなる可能性があるので、で割ったあまりを出力してください。
この問題を考えてみたが煮詰まってしまい、泣きながら解答を見ると包除原理を利用した解法が載っていた。
解答には大まかに以下のような説明が載っていた。
各要素が以上以下の整数である集合について「なる全てのについて」が成り立つの組の個数はである。
包除原理より、上の個数にをかけたの全てのに対して総和をとったものが答えになる。
止まりなさい。完全にスピード違反である。
私の知っている包除原理は次のようなものである。
集合の和集合の元の個数は以下で表される。
包除原理をこの問題に対応させてみる。
を「なる全てについてが成り立つの組の集合」として定義する。
このときについてが成り立つとき、も成り立つ。
ここで、「に少なくとも一つを満たすが存在する」ようなの組の個数を考えると、それは上の包除定理の式にあてはめて、以下のように表せる。
ここで、「なる全てのでが成り立つ」ようなの組の集合は上で考えた集合の補集合になっている。よって、今計算した結果を用いて答えを求められそうだ。
全体集合の元の個数は(の並べ方になんの制約もないときの組の個数)と表せるので、求める個数は
このように数式を変形させていくと、確かに求める個数がの総和で表されるという結果になった。