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

2022-05-29 18:33:10 字數 983 閱讀 7645

題目:problem description

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

245 45

33 6 9

55 7 8 9 10

0sample output

noyes

9 5yes

8 19 0

10 3

思路:nim博弈裸題,將每堆的石子數異或起來,如果為0,那麼先手必敗,否則先手必勝。不過,這題還要求我們求出所有的第一步取石子的方案,我們知道a^b^a = a,而nim博弈的原理是如果先手不是開場就已經確定必敗,那麼先手就可以通過拿石子來將局勢轉換為後手必敗(即異或和為0),要做到這一點只需將某一堆取走其他所有石子數異或到的值就行,因為a^a=0。

**實現如下:

1 #include 2 #include 3

using

namespace

std;45

const

int maxn = 2e5 + 7;6

intn, ans;

7int

a[maxn];89

intmain()

16if(ans == 0) puts("no"

);17

else24}

25}26}

27return0;

28 }

HDU 2176 取 m堆 石子遊戲

尼姆博弈。講解 有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。這種情況最有意思,它與二進位制有密切關係,我們用 a,b,c 表示某種局勢,首先 0,0,0 顯然是奇異局勢,無論誰面對奇異局勢,都必然失敗。第二種奇異局勢是 0,n,n 只要與對手拿...

HDU 2176 取 m堆 石子遊戲

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

HDU2176取 m堆 石子遊戲

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