ACC2016 24日目「色塗り2」解説
Advent Calendar Contest 2016 24日目の問題「色塗り2」を出題させていただいたので、その解説
問題はこちら。
根付き木の同型性に関して扱うときの常套テクとして、各子に何らかの順序をつけてソートすることによって標準化をします。
つまり、「葉に塗る色の番号は左から見たときに昇順になっていなければならない」というルールを付けて数え上げることにすると良いです。
そうすることで、重複無く数え上げることができます。
よく見るとまんま重複組み合わせですね。
「葉が b 個根に付いた根付き木の頂点を c 色で塗り分ける場合の数」を d とします。
すると、元の問題の場合の数は「葉が a 個根に付いた根付き木の葉を d 色、根を c 色で塗り分ける場合の数」と同じです。
例えば、
という具合です。
パスカルの三角形の偶奇を眺めてみたりすると分かるかもしれません。
ここで重要なのが、y を超えるような2冪数を T としたとき、
であることです。
つまり、x の正確な値が分かっていなくても、
の値さえ分かっていれば
が計算できます。
あとは剰余演算に慣れた人ならそれほど難しくありません。
階乗は前計算しておけばいいのですが、そのまま計算すると割り算で詰むので、工夫が必要です。
値を「奇数*(2冪)」という形に分解し、「奇数」と「指数の肩」の組
を計算しておきます。
すると
という形で計算ができます。
KUPC2016のI問題「色塗り」で、本番でそのままmodで計算していってもいいのか考えて、mod 2だとダメだよなぁと思ったのがこの問題を作ったきっかけです。
mod 10億7だとコンビネーションの分母がmodと互いに素になるのでOKっぽい。
この問題ではmod 2までで諦めてしまいましたが、
を高速で計算できたりしませんかね?→sigma氏からnCm mod 素べきの計算法の論文を教えてもらいました
open all / close all
generated by indenter