8
競技数学解説
文献あり

Grundy数のおはなし(後編)

461
0

 これは AMC2023 (Adventure Math Calendar2023)の5日目の記事です.4日目までの記事、とても面白いので読みましょう(読みましょう)


  前編 では,不偏ゲームの勝敗を判定する方法や,Grundy数についてざーっと紹介しました.この記事では,こういったものがどのように問題に適用できるのかを見ていきたいと思います.
 今回紹介する2問はちょっと難しめです... 解法を理解するというよりは「そんな使い方できるんだー」程度に思ってもらえればいいと思います. 自分がうまく説明できる自信もないので

4. OMC133(E)  700点問題

OMC133(E)

  無数にある白紙のカードを使って,あなたはOMC君と次のゲームを行います.


【ルール】まず,ゲームマスターが次の一連の操作を5000回続けて行う.

  • 1以上149以下の整数のうち1つを任意に選ぶ.
    これがi回目(i=1,2,,5000)の操作のとき,選ばれた数をsiとする.
  • 白紙のカードを1枚とり,そこにsiを書き込む.

ただし,ゲームマスターはゲームの進行に中立な存在である.
 その後,あなたとOMC君は交互に次の一連の操作を行う.OMC君が先攻である.

  • 2以上の整数が書かれたカードを1枚選び,白紙に戻す.このとき書かれていた数をxとおく.
  • 次をともにみたす正整数y,zを選ぶ.gcd(y,z)1, y+z=x
  • 白紙のカードを2枚とり,それぞれにy,zを書き込む.

 先に操作を行えなくなった方が負けであり,もう一方が勝ちである.


 両者が自身の勝ちのために最適に行動します.このとき,ゲームは有限回の操作で終了し,組(s1,s2,,s5000)ごとにあなたとOMC君のいずれが最終的に勝つかが定まります.1495000通りある組のうち,あなたが最終的に勝つものはM通りあります.
 M4999で割った余りを求めて下さい.

 例を出すと
(2,3,4,4,6)(2,3,2,2,4,6)(2,3,2,2,2,2,6)(2,3,2,2,2,2,3,3)
というような感じです. 楽しそう

 さて,まずこの問題は不偏ゲームです.なので漸化式かGrundy数を使いたいです.でも漸化式で解くのはとてつもない計算になるので,きっとGrundy数が使えるんだろうなと考えます.

 では,この問題において「1つ分のゲーム」はどれにしたら良いでしょうか.実は初期状態でのカード1枚分1つ分にすると,(それらは関わりがないので)それらのGrundy数の排他的論理和で求めることができて,めでたしめでたしです.
 以下では

G(n)=nのカード1枚がある状態でのGrundy数

と定義します.

Grundy数の計算

 ここが本質です.(え?) まず,G(1)=G(2)=0となります.(操作できない状態は0にすることに気を付けて)実験をすると,
G(3)=0, G(4)=mex(g({2,2}))=1, G(5)=0, G(6)=mex(g({2,4}),g({3,3}),g({4,2}))=2, G(7)=0, G(8)=mex(g({2,6}),g({4,4}),g({6,2}))=1,
 (g({y,z})=G(y)G(z)が成り立つことに気を付けます)
 ここから次のように推測できます.

  • x6以上で4で割った余りが2ならg(x)=2
  • x4の倍数ならg(x)=1
  • x2または奇数ならg(x)=0

 これは実際にg({y,z})=G(y)G(z)を使うと示すことができます.これを書くと公式解説の丸写しになってしまうので書きたくない 公式解説を見て下さい(人任せ)


 最後にg()=G(s1)G(s2)G(s5000)だったので,s1,s2,,s5000の中に4の倍数も,6以上の4で割って2余る数も偶数個含まれていればよく,この個数を求めると答えが出ます.
 個数を求めるのは割と容易なのでスキップします.(ここが気になる人は「母関数」などでぐぐると分かりやすい記事がたくさんあります)

5. OMC051(F)  700点問題

OMC051(F)

 S={0,1,2,,1020211}とし,Sの空でない部分集合{a1,a2,,an}に対しそのスコアを以下で定めます: 2a1+2a2++2an
 以下の条件をみたすSの部分集合Xであって,そのスコアが最大になるものは一意に存在することが保証されます.その元の個数を素数1009で割った余りを求めてください.

  • 任意のa,bXに対して,a,bの十進法表記で各桁を比較すると,ちょうど2020ヵ所が一致することはない.

 ただし,上の条件においてa,bが十進法表記で2021桁に満たない場合は,例えば1ならば000001のように,先頭に0を適当に補うことで2021桁の数とみなして考えるものとします.

 334335のように,ちょうど1桁が違うようなものが存在しないようにスコアを大きくするとき,要素数はいくつ?という問題です.
 スコアの最大化はXの要素を大きい順に選んでいけば良い(2n>2n1+2n2++20なので)ですが,以下では小さい順で考えていきます.このように考えても1020211(X)とすれば大小関係がひっくり返るので,問題ありません.
 さて,この問題はゲームとは縁が無さそうですが,実は次のようなゲームを考えるとうまくいきます.

 2021個の山があり,i個目の山にはai(9)個の石が積まれている.先手・後手はここから「1つの山を選び,そこから1個以上の石をとる」という操作を交互に行う.自分の番で石を0個にしたら勝ちである.
 両者が最適に行動するとき,どちらが勝つか?

 これを解くのはGrundy数を使えば良いです.ai個石が積まれた1つの山について,そのGrundy数はaiだと分かります.よって,a1a2a20211なら先手必勝,そうでないなら後手必勝となります.

 今度は漸化式を使ってみます.20213に変えて数が小さいところから求めていきます.
f(0,0,0)=0, f(0,0,1)=f(0,0,0)=1, f(1,1,0)=f(1,0,0) & f(0,1,0)=0, f(0,0,2)=f(0,0,1) & f(0,0,0)=1
 ...漸化式は「遷移できる状態が全て1なら00があるなら1」でした.これって元の問題と似ていませんか?
 例えば,110を集合Xに入れるには,100,0102つがXに含まれていないようにしなければなりません.つまり,遷移できる状態の数が全て「含まれていない→1の状態」ならその数を入れて,遷移できる状態の数に「含まれている→0の状態」があるならその数を除かなければいけません.よって,このゲームを解くことは元の問題を解くことと同じになります!

 (大小関係を逆にした上で)ある要素がXに含まれる上のゲームにおいて後手必勝a1a2a2021=0

 なので,上の第3辺を満たす個数を求めれば良いです.(ちなみに個数には影響しませんが,大小関係を元に戻すと(9a1)(9a2)(9a2021)=0になります) 個数求めパートは""本質に比べれば""容易なのでここでもスキップします.

おわりに

 前後編に分けた長い記事になりましたが,なんとか書ききれて良かったです.みんなでGrundy数を攻略しまくって不偏ゲームの問題が出なくなるようにしてやりましょう!
 ここまで読んで頂きありがとうございました~!

参考文献

投稿日:2023125
更新日:2023126
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

じゃむ
じゃむ
30
3412
競技数学を食べています

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. 4. OMC133(E)  700点問題
  2. 5. OMC051(F)  700点問題
  3. おわりに
  4. 参考文献