Mathematica、Wolfram言語

数学研究するための問題の変形方法-Part2-1

入試問題変形 数学

今回も中学入試問題を変形してみましょう。まずは、前編として、問題をコードにする部分から始めます。

今回の問題

ある整数を、0より大きい整数の和で表わす方法が何通りあるかを考えます。使う数が同じで順番だけが違うものは、1とおりに数えます。また一個の整数だけを使うものも、1とおりとして数えます。0を使ってはいけません。たとえば、6を3個以下の整数の和で表わす方法は、
    6
    5+1
    4+2
    3+3
    4+1+1
    3+2+1
    2+2+2
の7とおりあります。
では、50を3個以下の整数の和で表わす方法は、何通りありますか。

(第5回算数オリンピック、ファイナル問題より)

今回はこの問題をコードにします。

コードのヒント

コードのヒント

コードは、1~50までのつの数の組み合わせを出力し、そこからつの数の和が3になるものを探します。問題に0を使ってはいけませんと書かれていますが、つの数の組み合わせの和のみを求めるコードにするので、を使います。詳しくは下の例をご覧ください。

例)

6    –    0+0+6  

5+1  –    0+1+5

コードの手順

コードの手順及び解答

まずは、1〜50までの3つの数の組み合わせを出力しますが、並び替えると同じ組み合わせになるのを覗くので、Sort関数、その後、Unionを使用します。Union使用時、括弧の数が多くなってしまうので、Flattenを使用します。

daa = Union[Flatten[Table[Sort[{a, b, c}], {a, 0, 50}, {b, 0, 50}, {c, 0, 50}],2]];

あとは、Selectを使用し、和が50になる組み合わせを探します。全て求める必要はないので、Length関数で長さを出力します。

Length[Select[daa, (#[[1]] + #[[2]] + #[[3]]) == 50 &]]

よって答えは234とわかります。普通に解くよりも断然早いですね。

※コードは他にも何種類も考えられます。

次回はこの問題を変形していきます。

コメント

タイトルとURLをコピーしました