今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(1)～導入編

# 0. はじめに
2023年10月，将棋棋士の藤井聡太さんが前代未聞の八大タイトル全制覇を成し遂げた。既にタイトル戦以外の一般棋戦４つも制していたことから，イニシャルのＦより

<b><font color="red">す　べ　て　が　Ｆ　に　な　る</font></b>

とも言われた。元ネタは森博嗣氏の小説Ｓ＆Ｍシリーズの第一作である。初版は今から30年ほど前であるが，その後，何度もコミカライズ，テレビドラマ化，アニメ化され，息の長いコンテンツとなった。ちなみに自分はテレビドラマ版が一番好きだ。周囲の目を惹く美人という西之園萌絵くんのイメージに一番しっくりくる。原作小説もその時に集めたものだ。

1996年04月05日 小説「すべてがFになる」講談社，森博嗣
1996年09月02日 小説「笑わない数学者」講談社，森博嗣
2002年02月24日 漫画「すべてがFになる」全1巻，幻冬舎，浅田寅ヲ
2014年10月21日 テレビドラマ「すべてがFになる」全10回，フジテレビ
2015年05月28日 漫画「すべてがFになる THE PERFECT INSIDER」全2巻，講談社，霜月かいり
2015年10月09日 テレビアニメ「すべてがFになる THE PERFECT INSIDER」全11回，フジテレビ

さてシリーズ第３作の「笑わない数学者」はドラマ化されてはいないが，作中に登場するビリヤードの問題はそれなりに有名なようで検索すると挑戦者が何人も見つかる。当時と違って今ならビリヤードの問題も余裕で解けるはずだ。

# 1. 問題
問題を引用する。ちなみに作中に解答は記載されていない。
「五つのビリヤードの玉を真珠のネックレスのようにリングにつなげてみるとしよう。玉にはそれぞれナンバーが書いてある。さて，この五つの玉のうち幾つ取っても良いが，隣どうし連続したものしか取れないとしよう。一つでも二つでも五つ全部でも良い。しかし離れているものは取れない。この条件で取った球のナンバーを足し合わせて１から２１までのすべての数ができるようにしたい。さあ，どのナンバーの玉をどのように並べてネックレスを作ればよいかな？」

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">A</text>
<text x="24.9" y="100.1" fill="#000000" font-size="16">B</text>
<text x="61.2" y="211.9" fill="#000000" font-size="16">C</text>
<text x="178.8" y="211.9" fill="#000000" font-size="16">D</text>
<text x="215.1" y="100.1" fill="#000000" font-size="16">E</text>
</svg>
title
<$billiard>
図０　問題概要
end title
@enduml
```

# 2. 解法
五つの玉から隣どうし連続するものを取り出す組み合わせは２１通りである。仮に玉をＡ～Ｅとして図０のように並べた場合，取り出す組み合わせは以下のようになる。これらの組み合わせによる数が重複せず１～２１の数に１対１で対応する必要があり，まさにギリギリの条件である。

<table>
<caption>表１　五つの玉から隣どうし連続する玉を取り出す組み合わせ</caption>
<thead>
<tr><th style="text-align:center;">個数</th>
    <th style="text-align:center;">組み合わせ</th>
    <th style="text-align:center;">組み合わせ数</th></tr>
</thead>
<tbody>
<tr><td style="text-align:center;">一個</td>
    <td>Ａ，Ｂ，Ｃ，Ｄ，Ｅ</td>
    <td style="text-align:right;">５</td></tr>
<tr><td style="text-align:center;">二個</td>
    <td>ＡＢ，ＢＣ，ＣＤ，ＤＥ，ＥＡ</td>
    <td style="text-align:right;">５</td></tr>
<tr><td style="text-align:center;">三個</td>
    <td>ＡＢＣ，ＢＣＤ，ＣＤＥ，ＤＥＡ，ＥＡＢ</td>
    <td style="text-align:right;">５</td></tr>
<tr><td style="text-align:center;">四個</td>
    <td>ＡＢＣＤ，ＢＣＤＥ，ＣＤＥＡ，ＤＥＡＢ，ＥＡＢＣ</td>
    <td style="text-align:right;">５</td></tr>
<tr><td style="text-align:center;">五個</td>
    <td>ＡＢＣＤＥ</td>
    <td style="text-align:right;">１</td></tr>
<tr><td style="text-align:center;">合計</td>
    <td></td>
    <td style="text-align:right;">２１</td></tr>
</tbody>
</table>

１と２だけは組み合わせで作れないので五つの玉の中に必ず含まれてなければならない。加えて総和が２１になる組み合わせとなると以下の７つしかない。

- その１（１，２，３，４，１１）
- その２（１，２，３，５，１０）
- その３（１，２，３，６，９）
- その４（１，２，３，７，８）
- その５（１，２，４，５，９）
- その６（１，２，４，６，８）
- その７（１，２，５，６，７）

## その１（１，２，３，４，１１）の場合 ⇒ ＮＧ
１の両隣に２と３を置くことはできない。１＋２＝３であるし，１＋３＝４であるが，３と４の玉は既に存在しており，重複してしまうからである。ギリギリの問題なので，重複すると１～２１までの全ての数を作ることができない。この結果，１の両隣には４と１１の玉を置くことになる。※以後，重複するとＮＧとなる論理を多用する。
```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.9" y="100.1" fill="#000000" font-size="16">4</text>
<text x="61.2" y="211.9" fill="#000000" font-size="16">2</text>
<text x="178.8" y="211.9" fill="#000000" font-size="16">3</text>
<text x="210.1" y="100.1" fill="#000000" font-size="16">11</text>
</svg>
title
<$billiard>
図１－１　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewBox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">4</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">3</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">2</text>
<text x="210.106" y="100.1" fill="#000000" font-size="16">11</text>
</svg>
title
<$billiard>
図１－２　ＮＧの場合
end title
@enduml
```

しかしながら，いずれも１＋４＝２＋３で重複してしまい，ＮＧとなる。

## その２（１，２，３，５，１０）の場合 ⇒ ＯＫ
１の隣には２を置けない。また２の隣にも３を置けない。これより１の両隣の組み合わせは（３，５）（３，１０）（５，１０）の３つあるが，このうち（５，１０）は残る２と３が隣同士になるのでＮＧである。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="56.221" y="211.9" fill="#000000" font-size="16">10</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">2</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">5</text>
</svg>
title
<$billiard>
図２－１　ＯＫの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="220.1" cy="94.1" r="30" fill="#FFC0C0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FF00FF"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FFFF00"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">5</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">2</text>
<text x="210.106" y="100.1" fill="#000000" font-size="16">10</text>
</svg>
title
<$billiard>
図２－２　ＮＧの場合
end title
@enduml
```

図２－１は正解である。すなわち（１，３，１０，２，５）が正解の配置である。
一方，図２－２は３＋５＋２＝１０となって重複するのでＮＧである。

## その３（１，２，３，６，９）の場合 ⇒ ＮＧ
１の隣には２を置けない。また３の隣にも６を置けない。これより１の両隣の組み合わせは（３，６）（３，９）（６，９）の３つある。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<circle cx="220.1" cy="94.1" r="30" fill="#FFC0C0"/>
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">2</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">9</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">6</text>
</svg>
title
<$billiard>
図３－１　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M207.8 181.902 h-165.6 v48 h165.6" fill="#FFFFC0" transform="rotate(108,183.8,205.9)"/>
<circle cx="66.2" cy="205.9" r="30" fill="#FFC0C0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">9</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">2</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">6</text>
</svg>
title
<$billiard>
図３－２　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="183.8" cy="205.9" r="30" fill="#FFC0C0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FF00FF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#00FFFF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">2</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">6</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">9</text>
</svg>
title
<$billiard>
図３－３　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="220.1" cy="94.1" r="30" fill="#FFC0C0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#00FFFF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">6</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">2</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">3</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">9</text>
</svg>
title
<$billiard>
図３－４　ＮＧの場合
end title
@enduml
```

図３－１と図３－３は１＋３＋２＝６で重複，図３－２と図３－４は１＋６＋２＝９で重複するのでＮＧである。

## その４（１，２，３，７，８）の場合 ⇒ ＮＧ
１の両隣に２と７を置くことはできないので，３と８の玉を置くことになる。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">2</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">7</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">8</text>
</svg>
title
<$billiard>
図４－１　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">7</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">2</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">8</text>
</svg>
title
<$billiard>
図４－２　ＮＧの場合
end title
@enduml
```

いずれも１＋８＝２＋７で重複してしまい，ＮＧとなる。

## その５（１，２，４，５，９）の場合 ⇒ ＮＧ
１の隣には４を置けない。また４の隣にも５を置けない。これより１の両隣の組み合わせは（２，５）（２，９）（５，９）の３つあるが，このうち（２，９）は残る４と５が隣同士になるのでＮＧである。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">2</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">4</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">9</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">5</text>
</svg>
title
<$billiard>
図５－１　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#00FF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#00FFFF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">5</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">2</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">4</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">9</text>
</svg>
title
<$billiard>
図５－２　ＮＧの場合
end title
@enduml
```

いずれも１＋５＝２＋４で重複してしまい，ＮＧとなる。

## その６（１，２，４，６，８）の場合 ⇒ ＮＧ
２の両隣に４と６を置くことはできないので，１と８の玉を置くことになる。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">2</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">1</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">4</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">6</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">8</text>
</svg>
title
<$billiard>
図６－１　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">2</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">1</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">6</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">4</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">8</text>
</svg>
title
<$billiard>
図６－２　ＮＧの場合
end title
@enduml
```

いずれも２＋８＝４＋６で重複してしまい，ＮＧとなる。

## その７（１，２，５，６，７）の場合 ⇒ ＮＧ
１の両隣に５と６を置くことはできないので，２と７の玉を置くことになる。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="220.1" cy="94.1" r="30" fill="#FFC0C0"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">2</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">5</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">6</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">7</text>
</svg>
title
<$billiard>
図７－１　ＮＧの場合
end title
@enduml
```

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<path d="M101 1 h48 v165.6 h-48" fill="#FFFFC0" transform="rotate(-54,125,25)"/>
<path d="M42.2 181.9 h165.6 v48 h-165.6" fill="#FFFFC0" transform="rotate(-108,66.2,205.9)"/>
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">2</text>
<text x="61.221" y="211.9" fill="#000000" font-size="16">6</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">5</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">7</text>
</svg>
title
<$billiard>
図７－２　ＮＧの場合
end title
@enduml
```

図７－１は２＋５＝７で重複，図７－２は１＋７＝２＋６で重複してしまい，ＮＧとなる。

## まとめ

以上より，左右対称形，回転対称形を除けば正解は以下の一つしかない。

```plantuml
@startuml
<style>
root {
  margin 0
  paddig 0
}
title {
  fontstyle normal
  fontSize 16
}
</style>
sprite billiard <svg width="250" height="250" viewbox="0 0 250 250">
<circle cx="125" cy="125" r="100" stroke="#000000" fill="none"/>
<circle cx="125" cy="25" r="20" fill="#FF0000"/>
<circle cx="125" cy="25" r="20" stroke="#000000" fill="none"/>
<circle cx="29.9" cy="94.1" r="20" fill="#00FF00"/>
<circle cx="29.9" cy="94.1" r="20" stroke="#000000" fill="none"/>
<circle cx="66.2" cy="205.9" r="20" fill="#FFFF00"/>
<circle cx="66.2" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="183.8" cy="205.9" r="20" fill="#00FFFF"/>
<circle cx="183.8" cy="205.9" r="20" stroke="#000000" fill="none"/>
<circle cx="220.1" cy="94.1" r="20" fill="#FF00FF"/>
<circle cx="220.1" cy="94.1" r="20" stroke="#000000" fill="none"/>
<text x="120" y="31" fill="#000000" font-size="16">1</text>
<text x="24.894" y="100.1" fill="#000000" font-size="16">3</text>
<text x="56.221" y="211.9" fill="#000000" font-size="16">10</text>
<text x="178.779" y="211.9" fill="#000000" font-size="16">2</text>
<text x="215.106" y="100.1" fill="#000000" font-size="16">5</text>
</svg>
title
<$billiard>
図８　唯一の正解配置
end title
@enduml
```

# 3. 問題の一般化

```plantuml
@startuml
<style>
root {
  margin 0
  padding 0
}
footer {
  fontSize 16
  fontColor black
}
</style>
circle #FFFFFF;line:FFFFFF " " as X
storage #FF0000 "<math>b_1</math>" As A
storage #00FF00 "<math>b_2</math>" As B
storage #FFFF00 "<math>b_3</math>" As C
storage #00FFFF "<math>b_4</math>" As D
circle #FFFFFF;line:FFFFFF " " as Y
storage #FF00FF "<math>b_n</math>" As F
storage #FF0000 "<math>b_1</math>" As G
circle #FFFFFF;line:FFFFFF " " as Z
X - A
A - B
B - C
C - D
D -[dotted]right- Y
Y -[dotted]right- F
F - G
G - Z
footer 図９　一般化した問題
@enduml
```

さてビリヤードの玉を $n$ 個に拡張した場合を考える。$n$ 個の玉の総和は $n(n-1) + 1$ となる。こうして $n \le 17$ まで調べた結果を以下に示す。

<table>
<caption>表２　一般化したビリヤードの問題の解</caption>
<thead>
<tr><th style="text-align:center;">$n$</th>
    <th style="text-align:center;">総和</th>
    <th style="text-align:center;">正解</th>
    <th style="text-align:center;">解の数</th></tr>
</thead>
<tbody>
<tr><td style="text-align:right;">１</td>
    <td style="text-align:right;">１</td>
    <td>（１）</td>
    <td style="text-align:right;">１</td></tr>
<tr><td style="text-align:right;">２</td>
    <td style="text-align:right;">３</td>
    <td>（１，２）</td>
    <td style="text-align:right;">１</td></tr>
<tr><td style="text-align:right;">３</td>
    <td style="text-align:right;">７</td>
    <td>（１，２，４）</td>
    <td style="text-align:right;">１</td></tr>
<tr><td style="text-align:right;">４</td>
    <td style="text-align:right;">１３</td>
    <td>（１，２，６，４）<br>（１，３，２，７）</td>
    <td style="text-align:right;">２</td></tr>
<tr><td style="text-align:right;">５</td>
    <td style="text-align:right;">２１</td>
    <td>（１，３，１０，２，５）</td>
    <td style="text-align:right;">１</td></tr>
<tr><td style="text-align:right;">６</td>
    <td style="text-align:right;">３１</td>
    <td>（１，２，５，４，６，１３）<br>（１，２，７，４，１２，５）<br>（１，３，２，７，８，１０）<br>（１，３，６，２，５，１４）<br>（１，７，３，２，４，１４）</td>
    <td style="text-align:right;">５</td></tr>
<tr><td style="text-align:right;">７</td>
    <td style="text-align:right;">４３</td>
    <td>なし</td>
    <td style="text-align:right;">０</td></tr>
<tr><td style="text-align:right;">８</td>
    <td style="text-align:right;">５７</td>
    <td>（略）</td>
    <td style="text-align:right;">６</td></tr>
<tr><td style="text-align:right;">９</td>
    <td style="text-align:right;">７３</td>
    <td>（略）</td>
    <td style="text-align:right;">４</td></tr>
<tr><td style="text-align:right;">１０</td>
    <td style="text-align:right;">９１</td>
    <td>（略）</td>
    <td style="text-align:right;">６</td></tr>
<tr><td style="text-align:right;">１１</td>
    <td style="text-align:right;">１１１</td>
    <td>なし</td>
    <td style="text-align:right;">０</td></tr>
<tr><td style="text-align:right;">１２</td>
    <td style="text-align:right;">１３３</td>
    <td>（略）</td>
    <td style="text-align:right;">１８</td></tr>
<tr><td style="text-align:right;">１３</td>
    <td style="text-align:right;">１５７</td>
    <td>なし</td>
    <td style="text-align:right;">０</td></tr>
<tr><td style="text-align:right;">１４</td>
    <td style="text-align:right;">１８３</td>
    <td>（略）</td>
    <td style="text-align:right;">２０</td></tr>
<tr><td style="text-align:right;">１５</td>
    <td style="text-align:right;">２１１</td>
    <td>なし</td>
    <td style="text-align:right;">０</td></tr>
<tr><td style="text-align:right;">１６</td>
    <td style="text-align:right;">２４１</td>
    <td>なし</td>
    <td style="text-align:right;">０</td></tr>
<tr><td style="text-align:right;">１７</td>
    <td style="text-align:right;">２７３</td>
    <td>（略）</td>
    <td style="text-align:right;">６</td></tr>
</tbody>
</table>

もちろんこれらの結果は手計算で求めたわけでなく，プログラムを作成して求めた。このプログラムの紹介をするには本記事は長くなり過ぎたので次回にする。

https://qiita.com/TETSURO1999/items/be4a8b460a690a48236b?1

# 4. 参考文献
- [森博嗣の小説中の問題をRubyで解いた - Qiita](https://qiita.com/tachiyama/items/c7faf3cc2029a10a1cd0)