人工知能と競プロやってくブログ

深層学習・機械学習・AI・atcoder・競技プログラミングについて調べてやってみたことをまとめるブログです

AtCoder Beginner Contest 178 [ C - Ubiquity ]をPythonで解く。包除原理問題(🟫茶diff、300点)

atcoder.jp

解法

各条件について考えてみる。

  • 
0≤A_i≤9
    これを満たす数列の個数(ア) = 10N

  • 
A_i=0
なるiが存在する(イ)。
    これを満たす数列の個数 = 10N - 9N
    9N1≤A_i≤9を満たす個数

  • 
A_i=9
なるiが存在する(ウ)。
    これを満たす数列の個数 = 10N - 9N
    9N0≤A_i≤8を満たす個数

f:id:uchidamax:20210629022557p:plain
abc178_c
問題の答えとしては(オ)を求める。

ここで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さんの説明にならっている。

ja.wikipedia.org