C - ABS Ball 解説
by
milkcoffee
\(k = \sum |a_i-b_i| \) とし、 \(k\) ごとに答えを求めます。
\(N\) 個のボールについて、 \(k\) 個のボールは一旦白のままとし、残り \(N-k\) 個のボールは\((N-k)/2\) 組の赤と青のボール \(1\) 個ずつのペアにして考えます。
まず、\((N-k)/2\) 組の赤と青のボールのペアの入れ方を決めます。この方法は簡単な二項係数で求めることができます。 どのような入れ方であっても、全ての箱 \(i\) について \(|a_i-b_i| = 0\) のままです。
次に、白のボールの入れ方を決めます。箱 \(i\) に入れる白いボールの数を \(x_i\) とします。
ここで、白いボールを入れた後、各箱について「箱に入っている白いボール全てを赤か青どちらか同じ色で塗る」ことにすれば、 \(|a_i-b_i|=x_i\) です。
全ての白いボールの入れ方についての \(\prod x_i\) の総和を求めることを考えます。
この値は、「\(k\) 個の白いボールを \(M\) 個の箱に分けたのち、各箱からどれか \(1\) 個のボールを選ぶ(どのボールを選んだかは区別できる)方法の数」と解釈できます。
これは \(M-1\) 個の箱の仕切り、\(M\) 個の選んだ白いボール、 \(k-M\) 個の選ばなかった白いボールの並べ替えを考えれば良いです。
選んだ白いボールと箱の仕切りは必ず交互に並ぶため、これらを同一視して \(2M-1\) 個の仕切りと考えても求める数は変わりません。
結局、\(k-M\) 個の白いボールと \(2M-1\) 個の仕切りを並べる方法の数となり、 \(\binom {k + M - 1} {2M - 1}\) と表せます。
あとは、各箱について白いボールをどちらの色で塗るかを考慮して \(2^M\) をかければ良いです。
二項係数の前計算をすれば、 \(k\) ごとに \(O(1)\) で求められます。
全体の計算量は \(O(N)\) です。
投稿日時:
最終更新:
