Files
freeCodeCamp/curriculum/challenges/japanese/10-coding-interview-prep/project-euler/problem-391-hopping-game.md
2022-01-23 00:08:20 +09:00

2.2 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5900f4f31000cf542c510006 問題 391: ホッピングゲーム 5 302056 problem-391-hopping-game

--description--

0 から s_k までの数を 2 進数で表した場合の 1 の個数を、k とします。

例えば、0 から 5 を 2 進数で表すと、0, 1, 10, 11, 100, 101 となります。 1 が 7 個あるので、s_5 = 7 です。

数列 S = \\{s_k : k ≥ 0\\} の最初の部分は \\{0, 1, 2, 4, 5, 7, 9, 12, \ldots\\} です。

あるゲームを 2 人のプレイヤーで行います。 ゲームを始める前に、数 n が選択されます。 カウンター c は 0 から開始します。 各ターンで、プレイヤーは 1 から n (1 と $n$を含む) までの数を 1 つ選び、その数の分だけ c を増加させます。 c の結果の値は S の要素である必要があります。 これ以上は有効な手がない場合、そのプレイヤーは負けます。

例えば、n = 5 であり、c = 0 から始めるとします。

  • プレイヤー 1 が 4 を選ぶと、c0 + 4 = 4 になります。
  • プレイヤー 2 が 5を選ぶと、c4 + 5 = 9 になります。
  • プレイヤー 1 が 3 を選ぶと、c9 + 3 = 12 になります。
  • 以降も同様に続けます。

注意点として、c は常に S に属している必要があり、各プレイヤーはたかだか n の分だけ c を増加させることができます。

ここで、プレイヤー 1 が確実に勝つために最初のターンで選ぶことのできる最大の数を M(n) とし、そのような手がない場合は M(n)=0 とします。 例えば、M(2) = 2, M(7) = 1, M(20) = 4 です。

1 ≤ n ≤ 20 のとき、\sum M{(n)}^3 = 8150 であることを確認できます。

1 ≤ n ≤ 1000 のとき、\sum M{(n)}^3 を求めなさい。

--hints--

hoppingGame()61029882288 を返す必要があります。

assert.strictEqual(hoppingGame(), 61029882288);

--seed--

--seed-contents--

function hoppingGame() {

  return true;
}

hoppingGame();

--solutions--

// solution required