数学パズル

先日、イベントで家族と大学へ遊びに行った。数学科のブースでは、例年のごとく算数の問題が幾つか出されている。その一つをマクロで解くことに挑戦した。
f:id:Infoment:20190930220704p:plain

【問 題】
整数x,y,zの取りうる組合せ数を答えなさい。
 条件1.x,y,zは自然数である。
 条件2.x<y<zである。
 条件3.x+xy+xyz=31

ローラー作戦で解いてみた。足し算の結果が31なので、とりあえず31までループすれば、間違いないだろう。

Sub Abe_Shi()
    Dim x As Long
    Dim y As Long
    Dim z As Long
    
        For x = 1 To 31
            For y = 1 To 31
                For z = 1 To 31
                    If x + x * y + x * y * z = 31 Then
                        If x < y And y < z Then
                            Debug.Print "x=" & x & ", y=" & y & ", z=" & z
                        End If
                    End If
                Next
            Next
        Next
End Sub

結果は、以下のとおり。
f:id:Infoment:20190930221330p:plain

正解が出た。うむ、実に味気ない。

ちなみに、まじめにやるとこうなる。
x+xy+xyz=x(1+y+yz)=31

〇×△=31となる掛け算は、1×31しか存在しない。
従って、x=1が確定する。

1+y+yz=31
y(1+z)=30

掛け算で30になるのは、以下の4とおり。

  1. 1×30 ⇒ x=y=1となってNG
  2. 2×15 ⇒ y=2,z=15-1=14
  3. 3×10 ⇒ y=3,z=10-1=9
  4. 5×6  ⇒ y=z=5となってNG

以上のことから、組合せは

  1. x=1,y=2,z=14
  2. x=1,y=3,x=9

の2とおりとなる。

どちらの方法で解くかは、皆さんのお好みにお任せします。

参考まで。