No.303
\(L=1\) のときは最小コストは \(1\) で, その組み合わせの数は \(1\) である.
\(L=2\) のときは \(1\) のブロックを \(2\) つ購入し, そのうち \(1\) つを適当に分割して両端に配置すればいい. よって最小コストは \(3\) で, 組み合わせの数は無限である.
\(L \geq 3\) のときについては, 中央に切れ目があるかどうかを無視した組み合わせの数を \(C(L)\) とすると,
\[C(L) = \sum_{k=1}^{\ceil{L/2}} C(L-(2k-1))\]となる. ただし, \(C(0) = C(1) = 1\) である. これを愚直に計算すると間に合わないし, DP でやろうとしても桁が大きくなるので間に合わなくなる. そこで,
\[\begin{align} C(L) &= C(L-1) + \sum_{k=1}^{\ceil{L/2}-2} C(L-(2k-1)) \\ &= C(L-1)+C(L-2) \end{align}\]と書き換えると, フィボナッチ数列となることが分かる. これであれば行列表現を使えば \(O(\log L)\) で計算できるので間に合う.
なお, 中央に切れ目がある場合を除くには, \(C(L)-C(L/2)^2\) を計算すればいい. 当然ながらこれは \(L\) が偶数のときのみである.
桁数は相当大きくなるので, GMP を使う.