2.2 KiB
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 を選ぶと、
c
は0 + 4 = 4
になります。 - プレイヤー 2 が 5を選ぶと、
c
は4 + 5 = 9
になります。 - プレイヤー 1 が 3 を選ぶと、
c
は9 + 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