59 lines
2.2 KiB
Markdown
59 lines
2.2 KiB
Markdown
---
|
|
id: 5900f4991000cf542c50ffab
|
|
title: '問題 301: ニム (石取りゲーム)'
|
|
challengeType: 5
|
|
forumTopicId: 301955
|
|
dashedName: problem-301-nim
|
|
---
|
|
|
|
# --description--
|
|
|
|
ニムは石が積まれた山で遊ぶゲームです。2 人のプレイヤーが交互に任意の山から任意の数の石を取り、石がなくなったら終了です。
|
|
|
|
ここでは、3 つの山を使う一般的なニムの遊び方を考えます。ルールは次のとおりです。
|
|
|
|
- 開始時、石の山が 3 つあります。
|
|
- プレイヤーは自分のターンで、任意の 1 つの山から任意の正の整数個の石を取ります。
|
|
- 先に (もう石がないために) 石を取れなくなったプレイヤーの負けです。
|
|
|
|
サイズ $n_1$, $n_2$, $n_3$ の山がある場合のニムのポジションを ($n_1$, $n_2$, $n_3$) で表すとします。次の結果を返す単純な関数 $X(n_1,n_2,n_3)$ があります (この関数については自ら調べるか導出すること)。
|
|
|
|
- 0: 完璧な戦略に基づけば、現在のプレイヤー(今、自分の番を迎えている人) が最終的に負ける。
|
|
- 0 以外: 完璧な戦略に基づけば、現在のプレイヤー(今、自分の番を迎えている人) が最終的に勝つ。
|
|
|
|
例えば、$X(1, 2, 3) = 0$ です。なぜなら現在のプレイヤーが何をしても、対戦相手は同じサイズの山を 2 つ残すように石を取れるからです。その時点で、以降に現在のプレイヤーがどのように石を取っても対戦相手が同じように取れることが確定し、現在のプレーヤーは負けます。 下に具体例を示します。
|
|
|
|
- 現在のプレイヤーがポジションを (1,2,1) にする
|
|
- 対戦相手がポジションを (1,0,1) にする
|
|
- 現在のプレイヤーがポジションを (0,0,1) にする
|
|
- 対戦相手がポジションを (0,0,0) にし、勝つ。
|
|
|
|
$X(n, 2n, 3n) = 0$ となる正の整数 $n ≤ 2^{30}$ はいくつありますか。
|
|
|
|
# --hints--
|
|
|
|
`nim()` は `2178309` を返す必要があります。
|
|
|
|
```js
|
|
assert.strictEqual(nim(), 2178309);
|
|
```
|
|
|
|
# --seed--
|
|
|
|
## --seed-contents--
|
|
|
|
```js
|
|
function nim() {
|
|
|
|
return true;
|
|
}
|
|
|
|
nim();
|
|
```
|
|
|
|
# --solutions--
|
|
|
|
```js
|
|
// solution required
|
|
```
|