HDU2176 Nim博弈 SG函式求解

2021-08-21 21:23:53 字數 2291 閱讀 8785

m堆石子,兩人輪流取.只能在1堆中取.取完者勝.先取者負輸出no.先取者勝輸出yes,然後輸出怎樣取子.例如5堆 5,7,8,9,10先取者勝,先取者第1次取時可以從有8個的那一堆取走7個剩下1個,也可以從有9個的中那一堆取走9個剩下0個,也可以從有10個的中那一堆取走7個剩下3個.

input

輸入有多組.每組第1行是m,m<=200000. 後面m個非零正整數.m=0退出. 

output

先取者負輸出no.先取者勝輸出yes,然後輸出先取者第1次取子的所有方法.如果從有a個石子的堆中取若干個後剩下b個後會勝就輸出a b.參看sample output. 

sample input

2

45 45

33 6 9

55 7 8 9 10

0

sample output

no

yes9 5

yes8 1

9 010 3

nim遊戲:

有n堆石子,每堆石子的個數是有限的,合法的操作是:選擇一堆石子,拿走若干顆,不能不拿;最後拿走最後一顆石子者勝。

結論:必敗狀態:a1^a2^......^an=0(奇異局勢)

必勝狀態:a1^a2^.......^an=k (其中k不為零)

遇到奇異局勢的選手必敗

證明:n=1時,先手第一次可以全部取完,先手必勝;

1.對於某個局面(a1,a2,...,an),若a1^a2^...^an!=0,一定存在某個合法的移動,將ai改變成ai'後滿足a1^a2^...^ai'^...^an=0。

不妨設a1^a2^...^an=k,則一定存在某個ai,它的二進位制表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。

這時ai^ka1^a2^...^ai'^...^an=a1^a2^...^an^k=0。

2.對於某個局面(a1,a2,...,an),若a1^a2^a3...^an=0,先手遇到奇異局勢,先手必敗;

一定不存在某個合法的移動,將ai改變成ai'後,足a1^a2^...^ai'^...^an=0。

因為異或運算滿足消去率,由a1^a2^...^an=a1^a2^...^ai'^...^an可以得到ai=ai'。所以將ai改變成ai'不是乙個合法的移動

答案:假設從第 i 堆石子中取走(ai^k)個石子,(a1^a2^a3^...ai^....^an)^k=k^k=0,剩餘石子必然是奇異局勢,後手必敗;

若(ai^k) < ai,即從第i堆中取走的石子個數小於等於總個數,那麼就可以從這一堆石子中取

若(ai^k) > ai,即從第i堆中取走的石子個數大於總個數,那麼就不可以從這一堆石子中取

在這道題中如果當前是必勝的話,那麼就要下乙個移動的人必敗,所以就要改變乙個ai變成ai'使得原本的a1^...ai^...^an!=0變成a1^...ai'...^an=0,可以利用ai^k時間限制: 1 sec  記憶體限制: 128 mb

現在有n堆硬幣,第i堆硬幣有xi個硬幣。yoyo和灰灰輪流進行操作,每次操作只能選擇一堆硬幣,然後從這一堆硬幣中取任意多個硬幣(1~x,x為該堆最大數量),但不能不取。輪到的人如果沒有硬幣可取,則輸。yoyo先手,誰能獲勝?

首行輸入t,代表t組樣例

每組樣例第一行輸入n,代表n堆硬幣。n<=1000;

接下來n個數字(a1,a2,a3......an)代表每堆硬幣的硬幣數。an<=1000;

輸出誰贏。yoyo必勝輸出yoyo,否則輸出zhazhahui

2

32 3 4

42 3 4 5

yoyo

zhazhahui

分析:

對於一堆硬幣,假設有x個,則這堆硬幣取一次後,剩餘的個數可能是mex=,

sg表示最小的不屬於mex集合的最小非負整數,即sg(x)=x;

所以ans=x1^x2^x3.......xn;若ans=0,說明先手必敗,否則先手必勝

#includeusing namespace std;

int main()

if(ans==0)

printf("zhazhahui\n");

else

printf("yoyo\n");

} return 0;

}

取 m堆 石子遊戲 HDU2176(Nim博弈)

題目 problem description m堆石子,兩人輪流取.只能在1堆中取.取完者勝.先取者負輸出no.先取者勝輸出yes,然後輸出怎樣取子.例如5堆 5,7,8,9,10先取者勝,先取者第1次取時可以從有8個的那一堆取走7個剩下1個,也可以從有9個的中那一堆取走9個剩下0個,也可以從有10...

博弈論 Nim博弈 反Nim博弈 SG函式

nim遊戲 hdu1846 若各堆石子異或和為不為零,則先手勝 後手當且僅當異或和為零時取勝 此題問要想先手取勝第一步的取法,考慮到上述引理,只需遍歷一遍石子找到異或和的最高位匹配的個數。int a 105 int main return0 view code hdu 1848 在上題的基礎上取法只...

數學 nim博弈 SG函式

若乙個遊戲滿足 由兩名玩家交替行動 在遊戲程序的任意時刻,可以執行的合法行動與輪到哪名玩家無關 不能行動的玩家判負 則稱該遊戲為乙個公平組合遊戲。nim博弈屬於公平組合遊戲,但城建的棋類遊戲,比如圍棋,就不是公平組合遊戲。因為圍棋交戰雙方分別只能落黑子和白子,勝負判定也比較複雜,不滿足條件2和條件3...