公式

C - Divide into 4 Teams 解説 by admin


\(S=\sum_{i=1}^N P_i\) とします。\(S\) が奇数なら答えは明らかに \(0\) です。以降 \(S\) は偶数とします。

\(X\) を 「\(\{1 \dots N\}\) の部分集合 \(U\) のうち \(\sum_{i\in U}P_i = \frac{S}{2}\) を満たすものの個数」とします。

このとき、答えは \(X^2-2X\) になります。

\(X^2-2X\) になる理由

「各チームが空でもよい」として数えることにすると、\(X\) 通りの部分集合から独立に \(U,V\) の組を選ぶ \(X^2\) 通りの方法と、以下のチーム分けが一対一対応します。

  • \(i \in U\) かつ \(i \in V\) のとき、人 \(i\) はチーム \(A\)
  • \(i \notin U\) かつ \(i \notin V\) のとき、人 \(i\) はチーム \(B\)
  • \(i \in U\) かつ \(i \notin V\) のとき、人 \(i\) はチーム \(C\)
  • \(i \notin U\) かつ \(i \in V\) のとき、人 \(i\) はチーム \(D\)

このうち、\(U=V\) のときと \(U=\overline{V}\) のときのみ、空のチームが生まれます。(\(2X\) 通り)

\(X\) の求め方

\(X\) は簡単な部分和dpにより \(O(N (\sum{P_i}))\) で求めることができます。


余談

強さ \(p\) の人をチーム \(A,B,C,D\) に割り当てることをそれぞれベクトル \((p,0),(-p,0),(0,p),(0,-p)\) に対応させることを考えると、条件はベクトルの和が \(\vec 0\) になることと言い換えられます。

この \(4\) つのベクトルのうち \(1\) つを選ぶことを、\((\frac{p}{2},\frac{p}{2}),(-\frac{p}{2},-\frac{p}{2})\) のうち \(1\) つと \((\frac{p}{2},-\frac{p}{2}),(-\frac{p}{2},\frac{p}{2})\) のうち \(1\) つを独立に選んでその和を取ることに言い換えると、上記と同様の解法が得られます。

投稿日時:
最終更新: