【Tenka1 Programmer Contest】D - Crossing
問題概要
の部分集合の組について, 以下の条件を満たすものがあれば構築せよ.
[条件1] のうちどの整数も, のうちちょうど2つに含まれる.
[条件2] のうちどの2つの集合をとっても, その共通成分はちょうど1つである.
制約
考察
とりあえず, について考えてみると, として構築できる.
このと共通成分を1つずつもつようなを作りたい. ちょっと考えると, のように, 要素を追加すれば良いと分かる.
このと共通成分を1つずつもつようなを作りたい. 同様にして, のように, 要素を追加すれば良い.
こんな感じで再帰的に構築できそうだという予想がつく. このとき, より, 三角数でなければならない.
ACコード(Python3🐍)
n = int(input()) r = int((n*2)**.5) if r*(r+1)!=n*2: print('No') exit() # nは三角数 res = [[] for i in range(r+1)] tmp = 0 for i in range(r-1): for k in range(tmp,r-i+tmp): res[i].append(k+1) res[i+k-tmp+1].append(k+1) tmp += r - i res[-2].append(n) res[-1].append(n) print('Yes') print(len(res)) for l in res: print(len(l),*l)