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
2sample output45 45
33 6 9
55 7 8 9 10
0
nonim遊戲:yes9 5
yes8 1
9 010 3
有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...