のてすきあ − 完全独習非プログラマー −

Haskell で Project Euler を解く素人遊び

Problem 53

コンビネーション nCr の数が100万を超える (n,r) の組は何組あるか。( 1 ≦ n ≦ 100 )

 方針は立ちやすい。(n,r)を振ってコンビネーションを計算して、100万以上のものを拾う(問題文まんまやんけ)のみである。問題はコンビネーションを定義どおりに計算すると、時間がかかって仕方がないということだ。与えられた(n,r)に対してコンビネーションnCrを計算する方法に工夫が必要だ。

 1つ気づくのは、都度階乗を計算すると、同じ掛け算を何度も繰り返すことになるという点だ。こういうときはいつもの連想リストが使えそうである。もう1つはよく知られた漸化式を使えるのではないかという点である。少し調べてみた感じでは、これは常套手段なのだろうという印象である。

 以上の2点を素直に実装すれば、重たかったコンビネーションの計算も一瞬で片が付く。

 

型通りできれいに書けた☆