No.303

のときは特別扱いで, 長さ のブロックを1つ買い, うち1つを長さ に分割して の順に並べる. よってコストは で, 組み合わせは無限大である.

が奇数のときは, 長さ のブロックを買えば 円なので, 最小のコストは 円である.

が偶数のときは, 長さ のブロックと長さ のブロックを買えば 円なので最小コストは 円である.

よってどちらも最小コストは 円であり, ブロックの分割は考えなくていい.

長さ の塀を作るブロックの並び (真ん中に切れ目があってもいい) の組み合わせの数を とすると, 左端に長さ の長さのブロックを置いたときの残りの部分の組み合わせの数は なので,

s.t.

となる. とすると,

となるので, これを整理して,

となる. これはフィボナッチ数列である.

大きな数のフィボナッチ数列は行列を使った繰り返し2乗法で高速化する.

しかし, 計算結果が非常に大きくなる ( 以上) ので, BigInt では遅すぎてこれでも TLE してしまう.

そこで禁断の手ではある (環境に依存してしまう) が, GMP を使って計算を高速化することで TLE を避ける.

なお, が偶数のときは, 真ん中に切れ目があるブロックの並びの組み合わせの数 を引く.