ICG、Nim游戲椿肩、Bouton定理和SG函數(shù)

一瞻颂、 ICG

ICG(Impartial Combinatorial Games),即公平的組合游戲郑象,其定義如下:

  1. 兩名選手贡这。
  2. 兩名選手輪流行動(dòng),每一次行動(dòng)可以在有限合法操作集合中選擇一個(gè)厂榛。
  3. 游戲的任何一種可能的局面(position)盖矫,合法操作集合只取決于這個(gè)局面本身;局面的改變稱為“移動(dòng)”(move)击奶。
  4. 若輪到某位選手時(shí)辈双,該選手的合法操作集合為空,則這名選手判負(fù)柜砾。

在ICG游戲中湃望,先手不是必勝就是必?cái) WC明過(guò)程:

雙方互相決策痰驱,有限步驟证芭,可以用樹(shù)來(lái)描述,樹(shù)的每個(gè)葉子節(jié)點(diǎn)表示對(duì)先手而言是必勝或者必?cái) ?/p>

則對(duì)于樹(shù)上的每個(gè)節(jié)點(diǎn):

  1. 當(dāng)這個(gè)節(jié)點(diǎn)輪到先手行動(dòng)時(shí)担映,若其存在子節(jié)點(diǎn)對(duì)先手而言必勝废士,則當(dāng)前節(jié)點(diǎn)對(duì)先手而言必勝,否則當(dāng)前節(jié)點(diǎn)對(duì)先手而言必?cái) ?/li>
  2. 當(dāng)這個(gè)節(jié)點(diǎn)輪到后手行動(dòng)時(shí)蝇完,若其存在子節(jié)點(diǎn)對(duì)先手而言必?cái)」傧酰瑒t當(dāng)前節(jié)點(diǎn)對(duì)先手而言必?cái)〈H铮駝t當(dāng)前節(jié)點(diǎn)對(duì)先手而言必勝。

按照上述過(guò)程氢架,可以從決策樹(shù)的葉子節(jié)點(diǎn)開(kāi)始向根節(jié)點(diǎn)向上推出決策樹(shù)上每個(gè)節(jié)點(diǎn)對(duì)于先手而言必勝還是必?cái)∩悼В氏仁植皇潜貏倬褪潜財(cái) ?/p>

二、 Nim游戲

Nim游戲是ICG的一種达箍,通常的Nim游戲的定義是這樣的:有若干堆石子没龙,每堆石子的數(shù)量都是有限的,合法的移動(dòng)是“選擇一堆石子并拿走若干顆(不能不拿)”缎玫,如果輪到某個(gè)人時(shí)所有的石子堆都已經(jīng)被拿空了硬纤,則判負(fù)(因?yàn)樗丝虥](méi)有任何合法的移動(dòng))。

三赃磨、 Bouton定理

假設(shè)Nim游戲的石子有n堆筝家,第i堆的石子個(gè)數(shù)我們用a_i表示,則我們可以使用(a_1, a_2, …, a_n)表示一個(gè)Nim游戲的局面邻辉。對(duì)于(a_1, a_2, …, a_n)的Nim游戲局面溪王,當(dāng)且僅當(dāng)a_1 \wedge a_2 \wedge ... \wedge a_n \neq 0時(shí)(其中\wedge是按位異或運(yùn)算),先手必勝值骇。

證明:

  1. 對(duì)于a_1 \wedge a_2 \wedge ... \wedge a_n \neq 0的Nim游戲局面(a_1, a_2, …, a_n)莹菱,我們?cè)O(shè)a_1 \wedge a_2 \wedge ... \wedge a_n = k。則必存在a_i吱瘩,其二進(jìn)制表示在k的最高位上為1(異或運(yùn)算的性質(zhì))道伟,且有a_i \wedge k < a_i。則對(duì)于當(dāng)前局面下的先手可以通過(guò)合法的移動(dòng)將第i堆石子取到只剩a_i \wedge k個(gè)使碾,那么此時(shí)游戲局面變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=(a_1%2C%20a_2%2C%20...%2C%20a_%7Bi-1%7D%2C%20a_i%20%5Cwedge%20k%2C%20a_%7Bi%2B1%7D%2C%20...%2C%20a_n)" alt="(a_1, a_2, ..., a_{i-1}, a_i \wedge k, a_{i+1}, ..., a_n)" mathimg="1">蜜徽,而a_1 \wedge a_2 \wedge ... \wedge a_{i-1} \wedge (a_i \wedge k) \wedge a_{i+1} \wedge ... \wedge a_n = k \wedge k = 0。用一句話來(lái)講票摇,就是異或和不為0的局面一定存在合法移動(dòng)可以變?yōu)楫惢蚝蜑?的局面拘鞋。
  2. 對(duì)于a_1 \wedge a_2 \wedge ... \wedge a_n = 0的Nim游戲局面(a_1, a_2, …, a_n),假設(shè)我們將第i堆石子由a_i個(gè)取到a_i'個(gè)矢门,則有a_i \neq a_i'盆色,則必有a_1 \wedge a_2 \wedge ...\wedge a_{i-1} \wedge a_i' \wedge a_{i+1} \wedge ... \wedge a_n \neq 0(可用反證法證明)。用一句話來(lái)講祟剔,就是異或和為0的局面無(wú)論怎樣合法地進(jìn)行移動(dòng)傅事,都將轉(zhuǎn)變?yōu)楫惢蚝筒粸?的局面。
  3. 對(duì)于局面(0, 0, ..., 0)峡扩,其異或和為0,對(duì)于先手而言是必輸?shù)木置妗?/li>
  4. 對(duì)于任何異或和不為0的局面障本,先手只需要按照策略將其轉(zhuǎn)變?yōu)楫惢蚝蜑?的局面教届,就能保證后手永遠(yuǎn)只能拿到異或和為0的局面响鹃。又因?yàn)槊恳淮魏戏ǖ囊苿?dòng)都將導(dǎo)致石子個(gè)數(shù)減少,故總的移動(dòng)步數(shù)是有限的案训,最終后手將拿到(0, 0, ..., 0)的局面而無(wú)石子可拿买置,故后手必輸,先手必勝强霎。反過(guò)來(lái)即可證忿项,對(duì)于任何異或和為0的局面,先手必輸城舞。

四轩触、 SG函數(shù)

通過(guò)SG函數(shù),每個(gè)ICG都可以轉(zhuǎn)換成Nim游戲家夺。

SG函數(shù)的定義域?yàn)镮CG的決策樹(shù)上的所有節(jié)點(diǎn)脱柱,其具體定義為:SG(x) = mex\{SG(y) | y是x的子節(jié)點(diǎn)\},其中mex(minimal excludant)是施加于集合的運(yùn)算拉馋,表示最小的不屬于這個(gè)集合的非負(fù)整數(shù)榨为,比如mex\{0, 1, 2, 4 \} = 3mex\{1, 2, 3 \} = 0煌茴,mex\{\} = 0随闺。

對(duì)于ICG的決策樹(shù)上的節(jié)點(diǎn)v,我們可以把它想象成一個(gè)只有一堆石子蔓腐,個(gè)數(shù)為SG(v)的Nim游戲矩乐。

對(duì)于節(jié)點(diǎn)v的子節(jié)點(diǎn)u

  1. 根據(jù)SG函數(shù)的定義,必有SG(v) \neq SG(u)合住。
  2. SG(v) < SG(u)绰精,則根據(jù)SG函數(shù)的定義,u節(jié)點(diǎn)必定存在子節(jié)點(diǎn)w使得SG(w) = SG(v)透葛。倘若先手嘗試使得局面的SG函數(shù)值變大笨使,由局面v移動(dòng)到局面u,則后手必定可以將局面由u轉(zhuǎn)移到w僚害,恢復(fù)SG函數(shù)值硫椰。故先手無(wú)有效的手段讓局面的SG函數(shù)值增大,我們只需要考慮SG(v) > SG(u)的情況萨蚕。
  3. 對(duì)于全體SG(v) > SG(u)的子節(jié)點(diǎn)u靶草,其SG函數(shù)值將完整覆蓋區(qū)間[0, SG(v)-1]上的所有整數(shù)。我們從局面v移動(dòng)到局面u岳遥,其實(shí)相當(dāng)于在一堆個(gè)數(shù)為SG(v)的石子上取走若干石子奕翔,使剩下一堆個(gè)數(shù)為SG(u)的石子。

當(dāng)ICG中存在n個(gè)互相不干擾的移動(dòng)類型時(shí)浩蓉,我們可以將這n種移動(dòng)類型視為n堆石子派继,將該ICG視為n堆石子的Nim游戲宾袜。運(yùn)用前面的Bouton定理,該ICG的先手必勝與否的情況可以通過(guò)計(jì)算每個(gè)移動(dòng)類型下的初始狀態(tài)的SG函數(shù)驾窟,并計(jì)算這些SG函數(shù)值的異或和來(lái)得出庆猫。

五、例題HDU 1848 Fibonacci again and again

HDU 1848 Fibonacci again and again

這題就是個(gè)ICG绅络,其中在三堆石子上取石子的操作可以分成3種互相不干擾的移動(dòng)類型月培,故可將該問(wèn)題轉(zhuǎn)換為3堆石子的Nim游戲。這三堆石子的初始狀態(tài)為m恩急、n杉畜、p,計(jì)算SG(m) \wedge SG(n) \wedge SG(p)假栓,若該值不為0則先手必勝寻行,輸出“Fibo”,否則先手必?cái)∝揖#敵觥癗acci”拌蜘。

參考AC代碼:

#include <bits/stdc++.h>
using namespace std;
int f[500] = {1, 2}, mex[1001];
bool used[1001][1001];
int calc_mex(int x) {
    if (mex[x] >= 0) return mex[x];
    if (!x) return mex[x] = 0;
    for (int i=0; f[i]<=x; i++) used[x][calc_mex(x-f[i])] = 1;
    for (int i=0;;i++)
        if (!used[x][i]) return mex[x] = i;
}
int main() {
    for (int i=2;;i++) {
        f[i] = f[i-1] + f[i-2];
        if (f[i] > 1000) break;
    }
    memset(mex, -1, sizeof(mex));
    int m, n, p;
    while (scanf("%d %d %d", &m, &n, &p) && (m || n || p)) {
        int ans = calc_mex(m) ^ calc_mex(n) ^ calc_mex(p);
        printf(ans ? "Fibo\n" : "Nacci\n");
    }
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市牙丽,隨后出現(xiàn)的幾起案子简卧,更是在濱河造成了極大的恐慌,老刑警劉巖烤芦,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件举娩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡构罗,警方通過(guò)查閱死者的電腦和手機(jī)铜涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遂唧,“玉大人芙代,你說(shuō)我怎么就攤上這事「桥恚” “怎么了纹烹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)召边。 經(jīng)常有香客問(wèn)我铺呵,道長(zhǎng),這世上最難降的妖魔是什么隧熙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任片挂,我火速辦了婚禮,結(jié)果婚禮上贞盯,老公的妹妹穿的比我還像新娘宴卖。我一直安慰自己滋将,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布症昏。 她就那樣靜靜地躺著,像睡著了一般父丰。 火紅的嫁衣襯著肌膚如雪肝谭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天蛾扇,我揣著相機(jī)與錄音攘烛,去河邊找鬼。 笑死镀首,一個(gè)胖子當(dāng)著我的面吹牛坟漱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播更哄,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芋齿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了成翩?” 一聲冷哼從身側(cè)響起觅捆,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎麻敌,沒(méi)想到半個(gè)月后栅炒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡术羔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年赢赊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片级历。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡释移,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鱼喉,到底是詐尸還是另有隱情秀鞭,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布扛禽,位于F島的核電站锋边,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏编曼。R本人自食惡果不足惜豆巨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掐场。 院中可真熱鬧往扔,春花似錦贩猎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蝗罗,卻和暖如春艇棕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背串塑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工沼琉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桩匪。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓打瘪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親傻昙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闺骚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 3.感受數(shù)學(xué)# 上一期的文章里我們仔細(xì)研究了Nim游戲,并且了解了找出必勝策略的方法屋匕。但如果把Nim的規(guī)則略加改變...
    tdeblog閱讀 430評(píng)論 0 0
  • https://vjudge.net/problem/HDU-3980題意: 兩個(gè)人在一個(gè)由 n 個(gè)玻璃珠組成的...
    Gitfan閱讀 922評(píng)論 0 0
  • http://acm.hdu.edu.cn/showproblem.php?pid=1525 題意:給你兩個(gè)數(shù)葛碧,每...
    Gitfan閱讀 957評(píng)論 0 0
  • 1.必勝必?cái)B(tài)介紹# 假設(shè)存在一個(gè)游戲,游戲雙方通過(guò)一定相同的策略進(jìn)行游戲(假設(shè)都選擇最優(yōu)策略)过吻,直到一方無(wú)法進(jìn)行...
    tdeblog閱讀 708評(píng)論 1 0
  • 題目描述: 你和你的朋友进泼,兩個(gè)人一起玩 Nim游戲:桌子上有一堆石頭,每次你們輪流拿掉 1 - 3 塊石頭纤虽。 拿掉...
    逍遙ii閱讀 1,473評(píng)論 0 5