Tenka1 Programmer Contest-D:Crossing(500)

問題

https://beta.atcoder.jp/contests/tenka1-2018/tasks/tenka1_2018_d

整数 N が与えられます。\{1,2,...N\} の部分集合の組 (S_1,S_2,...,S_k) であって、以下の条件を満たすものが存在するか判定し、 存在する場合はひとつ構成してください。

  • 1,2,...,N のうちどの整数も、S_1,S_2,...,S_k のうちにちょうど 2 つに含まれる。
  • S_1,S_2,...,S_k のうちどの 2 つの集合をとっても、それらに共通して含まれる要素はちょうど 1 つである。

考え方

求めることは、部分集合の組である。部分集合の組の数を k とする。例として k=4 となる場合を考えよう。

2 つ目の条件を求めるべき k つの部分集合に適応すると、2 つの部分集合の組と共通の要素の関係は以下のようになる。

部分集合の 2 つの組 共通の要素
(S_1,S_2) A
(S_1,S_3) B
(S_1,S_4) C
(S_2,S_3) D
(S_2,S_4) E
(S_3,S_4) F

このとき、集合 S_1S_1 = \{ A, B, C \} の要素を持つことになる。同様にして部分集合 S_2, S_3, S_4 に持つべき要素も一意に定まる。

  • S_2 = \{ A, D, E \}
  • S_3 = \{ B, D, F \}
  • S_4 = \{ C, E, F \}

上記の議論により、解をもつ場合の必要条件は  2 \times N = k \times (k-1) が成り立つことである。N について、必要条件が成り立つことを確認し、満たす場合は Yes で上記で示した方法で部分集合を構成する。満たさない場合は No となる。

Submission #3489311 - Tenka1 Programmer Contest

ポイント

  • 求める内容から必要条件を整理する。

類題