Official

H - Cabbage Master Editorial by leaf1415


以下の解説では、Hallの定理、高速ゼータ/メビウス変換の知識を用います。

説明のため、\(j = 1, 2, \ldots, M\) について、会社 \(j\) から受けている「キャベツ \(B_j\) 個の注文」を、区別可能な \(B_j\) 個の「キャベツ \(1\) 個の注文」に分けます。
また、すべての会社のすべての注文からなる集合を \(O\) とおきます。 つまり、\(i\) 番目の会社の \(j\) 個目の「キャベツ \(1\) 個の注文」を \((i, j)\) で表すと、\(O\)\(\lbrace (1, 1), (1, 2) \ldots, (1, B_1), (2, 1), (2, 2), \ldots, (2, B_2), \ldots, (M, 1), (M, 2), \ldots, (M, B_M) \rbrace\) という \(\sum_{i = 1}^M B_i\) 個の注文からなる集合です。
また、キャベツのすべての品種からなる集合を \(V\) とおきます。 つまり、\(V = \lbrace \) 品種 \(1, \) 品種 \(2, \ldots, \) 品種 \(N \rbrace\) です。

高橋君がキャベツ名人の称号を得られる必要十分条件

高橋君がキャベツ名人の称号を得られる、つまり、集合 \(O\) のすべての注文を満足できるための必要十分条件を以下で考えます。
注文 \(x \in O\) に対して、「注文 \(x\) のために出荷可能な品種の集合」を \(S_x\) で表します。 つまり、注文 \(x\) が会社 \(j\) からの注文であれば、\(S_x = \lbrace \) 品種 \( i: c_{i, j} = 1\rbrace\) です。
また、注文の集合 \(T \subseteq O\) に対して、 品種の集合 \(S_T\)\(S_T= \bigcup_{x \in T} S_x\) と定めます。 つまり、\(S_T\) は「 \(T\) に含まれるいずれかの注文のために出荷可能な品種の集合」です。
Hallの定理から、集合 \(O\) のすべての注文を満足できるための必要十分条件が次の通りに得られます。

任意の \(T \subseteq O\) について、\(f(S_T) \geq |T|\) が成り立つ。

ここで、\(|\cdot|\) は集合の要素数を表し、\(f(S)\) は品種の集合 \(S\) に属するキャベツの個数の総数、つまり、\(f(S) = \sum_{\text{ 品種 }i \in S} A_i\) を表します。
上記の必要十分条件は下記のように言い換えられます。

\(\min_{T \subseteq O, T \neq \emptyset} \lbrace f(S_T) - |T| \rbrace \geq 0\)

\(T = \emptyset\) のときは \(f(S_T) - |T| = 0 \geq 0\) が成り立つことに注意してください。
これをさらに変形すると、

\(\min_{T \subseteq O, T \neq \emptyset} \lbrace f(S_T) - |T| \rbrace\)
\(= \min_{T \subseteq O, T \neq \emptyset} \min_{S \subseteq V, S \supseteq S_T} \lbrace f(S) - |T|\rbrace\)
\(= \min_{S \subseteq V} \min_{T \subseteq O, T \neq \emptyset, S _T \subseteq S} \lbrace f(S) - |T|\rbrace\)
\(= \min_{S \subseteq V} \lbrace f(S) - \max_{T \subseteq O, T \neq \emptyset, S_T \subseteq S} |T|\rbrace\)

となります。
ここて、\(T \subseteq O, T \neq \emptyset, S_T \subseteq S\) を満たす要素数最大の \(T\) は、\(S_x \subseteq S\) を満たすすべての注文 \(x\) からなる集合 \(\lbrace x \in O : S_x \subseteq S \rbrace\) です。
よって、\(\max_{T \subseteq O, T \neq \emptyset, S_T \subseteq S} |T| = |\lbrace x \in O : S_x \subseteq S \rbrace|\)です。
したがって、\(g(S) = |\lbrace x \in O : S_x \subseteq S \rbrace|\) と定めると、 \(\min_{T \subseteq O, T \neq \emptyset} \lbrace f(S_T) - |T| \rbrace = \min_{S \subseteq V} \lbrace f(S) - g(S) \rbrace\) とかけます。 (ただし、\(\lbrace x \in O : S_x \subseteq S \rbrace = \emptyset\) の場合は、\(g(S)\) の値は \(0\) ではなく便宜上 \(-\infty\) とします。これは、\(\max\) をとる範囲 \(T \subseteq O, T \neq \emptyset, S _T \subseteq S\) が空である場合に対応します。)

結局、集合 \(O\) のすべての注文を満足できるための必要十分条件として、

\(\min_{S \subseteq V} \lbrace f(S) - g(S) \rbrace \geq 0\)

が得られます。

すぬけ君が食べるキャベツの個数を求める方法

すぬけ君が食べるキャベツの個数 \(X\) を以下で求めます。
すぬけ君が食べるキャベツの組み合わせは、上記の必要十分条件より「ある \(S \subseteq V\)について\(f(S) - g(S) < 0\) となるもののうち、食べる個数が最小のもの」です。
このような組み合わせは、\(f(S) - g(S)\) が最小となる \(S \subseteq V\) を一つ求め(これを \(S_{\min}\) とおく)、\(S_{\min}\) に含まれる品種のキャベツのうちから \(\max(0, f(S_{\min}) - g(S_{\min})+1)\) 個を選ぶことで得られます。
よって、すぬけ君が食べるキャベツの個数 \(X\) は、\(X =\max(0, \min_{S \subseteq V} \lbrace f(S) - g(S)\rbrace+1)\) です。

\(X\) を求めるには各集合 \(S \subseteq V\)について、\(f(S)\)\(g(S)\) の値がわかれば十分です。
\(f(S)\) の値は \(\mathrm{O}(N2^N)\) で計算できます。
\(g(S)\) を求めるには、まず各集合 \(S \subseteq V\)について「 \(S_x = S\) となる注文 \(x\) の個数 \(g'(S)\) 」を求めます。これは、すべての会社を \(1\) 度走査することで \(\mathrm{O}(NM)\) 時間で計算できます。この \(g'\) に対して高速ゼータ変換を行うことで \(O(N2^N)\) 時間で所望の \(g\) が得られます。
以上で、すぬけ君が食べるキャベツの個数 \(X\) が求められました。

すぬけ君が食べるキャベツの選び方の個数を求める方法

以下で、すぬけ君が食べるキャベツの選び方の個数 \(Y\) を求めます。
\(X = 0\) のときは、キャベツの選び方としてあり得るのは「どのキャベツも選ばない」という \(1\) 個のみです。以下、\(X > 0\) の場合を考えます。
「すぬけくんが食べるキャベツの個数を求める方法」の項目で述べたように、すぬけ君が食べるキャベツの選び方は、「 \(f(S) - g(S)\) が最小となる \(S \subseteq V\)(複数存在する可能性がある)のうちいずれか一つを選んで、その\(S\) に含まれる品種のキャベツの中から\(X\) 個を選ぶ選び方」です。
これは、\(f(S) - g(S)\) が最小となるすべての \(S \subseteq V\) からなる集合族を \(\mathcal{F}\) とおく(すなわち、\(\mathcal{F} := \arg\min_{S \subseteq V} \lbrace f(S) - g(S) \rbrace\) )と、 「キャベツ全体から \(X\) 個を選ぶ方法のうち、選ぶすべてのキャベツの品種を含む \(S' \in \mathcal{F}\) が存在するような選び方」と言い換えられます。
よって、「キャベツ全体から \(X\) 個を選ぶ方法のうち、選ぶキャベツの品種の集合がちょうど \(S\) であるような選び方の個数」を \(h(S)\) で表すと、求める答え \(Y\)\(Y = \sum_{S \subseteq V, S\text{ を含む } S' \in \mathcal{F} \text{ が存在する }} h(S)\) と表せます。

これを計算する方法を考えます。 まず、集合 \(S \subseteq V\) に対して、\(S\) を 含む \(S' \in \mathcal{F}\) が存在するかを判定するには、「 \(S\) を含む \(S' \in \mathcal{F}\) の個数」が分かれば十分です。これは、高速ゼータ変換によって、\(\mathrm{O}(N2^N)\) 時間で計算できます。
次に、各集合 \(S \subseteq V\) について \(h(S)\) の値を求める方法を述べます。各集合 \(S \subseteq V\) について、\(h'(S)\) を「キャベツ全体から \(X\) 個を選ぶ方法のうち、選ぶキャベツの品種の集合が \(S\)含まれるような選び方の個数」とします。 \(h'(S)\) は二項係数として \(\binom{f(S)}{X}\) で求められます。 この \(h'\) に対して高速メビウス変換を行うことで、\(\mathrm{O}(N2^N)\) 時間で所望の \(h\) が得られます。
以上で、すぬけ君が食べるキャベツの選び方の個数 \(Y\) が求められました。

上記の議論から、この問題を \(\mathrm{O}(N2^N + NM)\) 時間で解くことができます。

posted:
last update: