Submit Search
Upload
Nimとgrundy数の大雑把な説明
•
3 likes
•
16,904 views
Y
yuta kasai
Follow
Nimとgrundy数の大雑把な説明 競プロ Advent Calendar 2017 の僕の記事の導入に使いました。
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 30
Download now
Download to read offline
Recommended
不偏ゲームがNIMに帰着する証明
不偏ゲームがNIMに帰着する証明
Azaika At
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
Recommended
不偏ゲームがNIMに帰着する証明
不偏ゲームがNIMに帰着する証明
Azaika At
指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
Kensuke Otsuki
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
動的計画法を極める!
動的計画法を極める!
HCPC: 北海道大学競技プログラミングサークル
ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
色々なダイクストラ高速化
色々なダイクストラ高速化
yosupo
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎
双対性
双対性
Yoichi Iwata
一般グラフの最大マッチング
一般グラフの最大マッチング
HCPC: 北海道大学競技プログラミングサークル
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
Kensuke Otsuki
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
Yuma Inoue
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
直交領域探索
直交領域探索
okuraofvegetable
様々な全域木問題
様々な全域木問題
tmaehara
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Yoichi Iwata
Convex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
目指せグラフマスター
目指せグラフマスター
HCPC: 北海道大学競技プログラミングサークル
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
Chokudai search
Chokudai search
AtCoder Inc.
最大流 (max flow)
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
AtCoder Inc.
直前合宿 講義スライド
直前合宿 講義スライド
tozan gezan
More Related Content
What's hot
ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎
双対性
双対性
Yoichi Iwata
一般グラフの最大マッチング
一般グラフの最大マッチング
HCPC: 北海道大学競技プログラミングサークル
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
Kensuke Otsuki
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
Yuma Inoue
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
直交領域探索
直交領域探索
okuraofvegetable
様々な全域木問題
様々な全域木問題
tmaehara
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Yoichi Iwata
Convex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
目指せグラフマスター
目指せグラフマスター
HCPC: 北海道大学競技プログラミングサークル
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Takuya Akiba
Chokudai search
Chokudai search
AtCoder Inc.
最大流 (max flow)
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
AtCoder Inc.
直前合宿 講義スライド
直前合宿 講義スライド
tozan gezan
What's hot
(20)
ユークリッド最小全域木
ユークリッド最小全域木
双対性
双対性
一般グラフの最大マッチング
一般グラフの最大マッチング
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Rolling Hashを殺す話
Rolling Hashを殺す話
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
直交領域探索
直交領域探索
様々な全域木問題
様々な全域木問題
指数時間アルゴリズムの最先端
指数時間アルゴリズムの最先端
Convex Hull Trick
Convex Hull Trick
目指せグラフマスター
目指せグラフマスター
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
Chokudai search
Chokudai search
最大流 (max flow)
最大流 (max flow)
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
直前合宿 講義スライド
直前合宿 講義スライド
Nimとgrundy数の大雑把な説明
1.
NimとGrundy数の 大雑把な説明 かっさ(@__KasSA)
2.
Nimとは ・一般的に、2人で盤上の石とかコインを取り合う ・1つの山を選択し、そこから1つ以上、好きなだけ取り除ける ・1つも取れなくなったほうが負けになるゲーム
3.
Nimとは ・一般的に、2人で盤上の石とかコインを取り合う ・1つの山を選択し、そこから1つ以上、好きなだけ取り除ける ・1つも取れなくなったほうが負けになるゲーム 必勝法が存在し、ゲームが始まる前に必勝か必敗かわかってしまう
4.
Nimとは ・一般的に、2人で盤上の石とかコインを取り合う ・1つの山を選択し、そこから1つ以上、好きなだけ取り除ける ・1つも取れなくなったほうが負けになるゲーム 必勝法が存在し、ゲームが始まる前に必勝か必敗かわかってしまう 必勝判定は、各山の枚数を XOR でまとめたときの値が 0ではない
:先手の勝ち 0である :先手の負け となっている
5.
(ゲーム値) = (0)
xor 9 = 9 0ではないので勝ち 9 枚 ・9 枚全部取れば勝てる ・強い 1山のとき
6.
2山ある時 4枚 4枚 戦略:先手が取った数だけ 後手が一方の山から取れば常に後手が勝てる (勝ちの目を維持できる) (ゲーム値) =
4 xor 4 = 0 0 なので負け 3枚 4枚 2枚 4枚 1枚 4枚 0枚 4枚 3枚 3枚 2枚 2枚 1枚 1枚 0枚 0枚 先手 後手
7.
2山ある時 3枚 5枚 戦略:先手が右の山から2枚取ると、 後手と先手が入れ替わった先の状況が再現できる (先手の番のゲーム値) =
3 xor 5 = 6 6 なので勝ち 3枚 3枚 (後手の番のゲーム値) = 3 xor 3 = 0 0 なので負け→先手の勝ち
8.
3山ある時 3枚 7枚 のこり枚数の xor
が0になるように 相手に手番を渡すことができれば勝ち 今 3 xor 7 xor 5 =1 なので、 3の山を2にすれば、 2 xor 7 xor 5 = 0 を相手に渡せる Xorについて考えるとうまくいくことが 示せるが割愛 (記事にはNimKの場合で書いたので K=1としても示せる) (ゲーム値) = 3 xor 7 xor 5 =1 1 なので勝ち 5枚
9.
N山ある時 3枚 7枚 のこり枚数の xor
が0になるように 相手に手番を渡すことができれば勝ち (ゲーム値) = pile[0] xor pile[1] xor pile[2] xor … xor pile[N-2] xor pile[N-1] 5枚 … 2枚 1枚 7枚
10.
Nimまとめ ・各山のXORを取ると、必勝判定ができる ・各山の枚数を XOR でまとめたときの値が 0ではない
:先手の勝ち 0である :先手の負け となっている
11.
ゲームの値。ざっくり言うと0のとき負け、 そうでないとき勝ち 求め方: 集合の非負整数を求める例1: ある状態から、次の状態のgrundy数 {0,1,2,4,5,6,7,8}が得られたとき → ある状態のgrundy数は、3 集合の非負整数を求める例2: ある状態から、次の状態のgrundy数
{1,2,3,4,5}が得られたとき → ある状態のgrundy数は、0 Grundy数 現在の状態から移行できる状態のGrundy数の集合の うち、存在しない最小の非負整数(mex)
12.
Grundy数 例:Nいっちゃだめゲーム (yukicoder No.008より改変) Alice,Bobの2人で数字を増加させるゲームをプレイする。0からはじめ て各プレイヤーは1から3までの数字を選択し、現在の数字に加算する。 最初にN以上の数字を作成した人の負けである。 2人が最適な洗濯をするとして、Aliceが先手のときAliceは必勝か? Nが与えられるのでSampleみたいに出力してください。(説明をサボらないで) 制約:1≦N≦10^5 Sample
Input1: 3 Sample Output1: Alice Win. Sample Input2: 13 Sample Output2: Bob Win.
13.
Grundy数 例:Nいっちゃだめゲーム (yukicoder No.008より改変) Alice,Bobの2人で数字を増加させるゲームをプレイする。0からはじめ て各プレイヤーは1から3までの数字を選択し、現在の数字に加算する。 最初にN以上の数字を作成した人の負けである。 2人が最適な洗濯をするとして、Aliceが先手のときAliceは必勝か? Nが与えられるのでSampleみたいに出力してください。(説明をサボらないで) 制約:1≦N≦10^5 解いてみてください 次ペーシ解法です
14.
Grundy数 例:Nいっちゃだめゲーム (yukicoder No.008より改変) Alice,Bobの2人で数字を増加させるゲームをプレイする。0からはじめ て各プレイヤーは1から3までの数字を選択し、現在の数字に加算する。 最初にN以上の数字を作成した人の負けである。 2人が最適な洗濯をするとして、Aliceが先手のときAliceは必勝か? Nが与えられるのでSampleみたいに出力してください。(説明をサボらないで) 制約:1≦N≦10^5 O(1)解法
: 周期から (N-1)%(3+1) が0のとき負け、そうでないときは勝ち O(N)解法 :何も分からないのでにとりあえずGrundy数を求める
15.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを言わざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 ? 0? ?? ?? ? 20 1 … ?? ? …
16.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを超えざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 ? 0? ?? ?? ? 20 1 … ?? ? … N-1の状態から次の状態に移動するとき、どの状態にも移動できない {} →N-1のgrundy数は0
17.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを言わざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 1 0? ?? ?? ? 20 1 … ?? ? … N-2の状態から次の状態に移動するとき、N-1に移動できる {0} →N-2のgrundy数は1
18.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを言わざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 1 0? 2? ?? ? 20 1 … ?? ? … N-2の状態から次の状態に移動するとき、N-1にしか移動できない {0} →N-2のgrundy数は1 N-3の状態から次の状態に移動するとき、N-2,N-1に移動できる {1,0} →N-3のgrundy数は2
19.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを言わざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 1 03 2? ?? ? 20 1 … ?? ? … N-4の状態から次の状態に移動するとき、N-3,N-2,N-1に移動できる {2,1,0} →N-4のgrundy数は3
20.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを言わざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 1 03 2? 0? ? 20 1 … ?? ? … N-5の状態から次の状態に移動するとき、N-4,N-3,N-2に移動できる {3,2,1} →N-5のgrundy数は0 N-1,N-5は負け状態であることがわかった 繰り返すことで、0 に対するGrundy数がわかる。→先手必勝かの判定ができる。
21.
Grundy数 O(N)解法 :何も考えずにGrundy数を求める 負けの状態のGrundy数は0。今回負けなのは数字がN-1のとき。 (N-1が回ってくるとNを言わざるをえないから) Grundy数の配列 N-2 N-1N-4
N-3N-6 N-5N-8 N-7 1 03 21 03 2 20 1 … (N-1)%(3+1) … Grundy数を求めていくと今回の問題では周期がGrundy数に存在して、 周期4だ…ということがわかる → 先のO(1)解法がわかる (N-2)%(3+1) (N-3)%(3+1)
22.
Grundy数 再帰関数で実装 std::setはlogといっても結構遅いので Grundy数の最大値が小さいなら、 bitset<MAX> Set や bool
Set[MAX]に 変更すると結構速くなる
23.
問題:とにかく盤面の分割ができるゲームでの必勝判定をしたい 例:分割されるゲーム Grundy数 その前にNimのGrundy数を考える
24.
Grundy数 NimのGrundy数を考える Nimの1山のGrundy数は、山にある石やコインの枚数に等しい。 全部の取る選択から、1枚だけ取るまでを選択できるので Grundy数の定義から枚数に等しい値が得られる。 4枚 3枚 2枚
1枚 0枚 4 3 2 1 0 枚数 Grundy数
25.
Grundy数 NimのGrundy数を考える Nimの1山のGrundy数は、山にある石やコインの枚数に等しい。 複数山あるときは、 XOR を取れば(なんかよくわからなくても)勝敗判定ができた 今 3
xor 7 xor 5 =1 なので、 3の山を2にすれば、 2 xor 7 xor 5 = 0 を相手に 渡せる (ゲーム値) = 3 xor 7 xor 5 =1 1 なので勝ち
26.
Grundy数 NimのGrundy数を考える Nimの1山のGrundy数は、山にある石やコインの枚数に等しい。 複数山あるときは、 XOR を取れば(なんかよくわからなくても)勝敗判定ができた したがって、Grundy数が求められるゲームが並列してたくさんあるときは、 各ゲームをNimの山として扱い、必勝判定ができる。
27.
Grundy数 NimのGrundy数を考える Nimの1山のGrundy数は、山にある石やコインの枚数に等しい。 複数山あるときは、 XOR を取れば(なんかよくわからなくても)勝敗判定ができた したがって、Grundy数が求められるゲームが並列してたくさんあるときは、 各ゲームをNimの山として扱い、必勝判定ができる。 なにかしらのゲームがあったとして、ある時この盤面を分割したとする。 → (複数に分割) 分割された盤面のGrundy数がわかると、 これはNimに変換できる!
28.
Grundy数 NimのGrundy数を考える Nimの1山のGrundy数は、山にある石やコインの枚数に等しい。 複数山あるときは、 XOR を取れば(なんかよくわからなくても)勝敗判定ができた したがって、Grundy数が求められるゲームが並列してたくさんあるときは、 各ゲームをNimの山として扱い、必勝判定ができる。 なにかしらのゲームがあったとして、ある時この盤面を分割したとする。 → (複数に分割) 分割された盤面のGrundy数がわかると、 これはNimに変換できる! ↓ (Nimにみえる) それぞれのGrundy数: 4
2 7 (分割前のGrundy数) =4 xor 2 xor 7 = 1
29.
Grundy数まとめ → (複数に分割) ・分割された盤面のGrundy数がわかると、 これはNimに変換できる。 ↓ (Nimにみえる) 4 2 7 (分割前のGrundy数)
=4 xor 2 xor 7 = 1 ・Nimの1山のGrundy数は、山にある石やコインの枚数に等しい。 ・ゲームの値。0のとき負け、そうでないとき勝ち。 ・求め方は、 現在の状態から移行できる状態のGrundy数の集合のうち、 存在しない最小の非負整数。(mex)
30.
忘れないうちに、 HackerRankの 5 days
of game theory を解きましょう! おわり
Download now