Sample 1 - Pasta Normalization Problem

2 secs 1024 MB
uni_kakurenbo's icon uni_kakurenbo

概要

没問です.
可愛そうなのでサンプル問題として使ってあげることにしました.

問題原案:uni_kakurenbo

解説

分割の方法は,正確に 2N12^{N-1} 通りありますから,これらを全て試すことはできません.

視点を変えて,11 本目の中パスタを構成する小パスタを固定することを考えてみます.
左からみて 11 以上 D1D_1 以下の位置にある小パスタを用いて 11 本目の中パスタを構成するとします.
すると,その中パスタの長さ H1=1iD1LiH_1 = \displaystyle \sum_{1 \leq i \leq D_1} L_i は一意に定まります.

H1H_1L\sum L の約数でなければ,分割は明らかに不可能です.

また,中パスタの長さは全て等しくなくてはなりませんから,11 本目の長さが決まれば,全てのその長さになるように他の中パスタを前から順番に構成していくことを試せます.
この操作で全ての小パスタを中パスタにすることができれば,そのときに限り可能です.
これは O(N)O(N) 時間で行うことができます.

約数の個数のオーダーを考えると,このアルゴリズム全体としての時間計算量は O(NL)O(N \sqrt{\sum L}) と見積れます.
なお,L\sum L 約数の個数は,実際には L\sqrt {\sum L} よりもずっと少ないです.

解説:uni_kakurenbo

実装例

C++