AtCoder Beginner Contest 178 [ C - Ubiquity ]をPythonで解く。包除原理問題(🟫茶diff、300点)
解法
各条件について考えてみる。
- これを満たす数列の個数(ア) = 10N
なるが存在する(イ)。
これを満たす数列の個数 = 10N - 9N
9Nはを満たす個数なるが存在する(ウ)。
これを満たす数列の個数 = 10N - 9N
9Nはを満たす個数
問題の答えとしては(オ)を求める。
ここでa, b, c, dを定義する。
a: (ア) = 10N
b: (イ)以外 = 9N
c: (ウ)以外 = 9N
d: (エ) = (イ)(ウ)以外 = 8N
a - b - c + d が(オ)の数、つまり答えとなる。
なぜ、この式で答えがでるのか。
イ、ウ、エ、オの4グループについて考える。
(イ): a、cに含まれる。 a - c なので0
(ウ): a、bに含まれる。 a - b なので0
(エ): a、b、c、dに含まれる。 a - b, -c + d なので0
(オ): a に含まれる。(イ)、(ウ)、(エ)が0なので(オ)が残る
実装
数学的な解法さえ、わかってしまえば実装はアッサリ。
参考
youtu.be 解法は、この放送のsnukeさんの説明にならっている。