取 m堆 石子遊戲(尼姆博弈)

2021-06-23 01:03:49 字數 877 閱讀 4789

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

2

45 45

33 6 9

55 7 8 9 10

0

sample output

no

yes9 5

yes8 1

9 010 3

解題思路

nim博弈

面臨必敗態直接輸出no,如果面臨必勝態要輸出方案。

必勝態時,要留給對手必敗態,所以只要求出其它堆的異或值就好了,因為兩個相同的數異或以後才是0,所以k賦成其他堆的異或值,和m[i]比較就行。 

ac**

#includeint main()

{ int n, m[200000], k, i, s;

while(scanf("%d",&n)!=eof)

{if( n==0 ) break;

s=0;

for(i=0; i

取 m堆 石子遊戲(尼姆博弈)

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

HDU 2176 取 m堆 石子遊戲 尼姆博弈)

思路 對於一組數,必勝態肯定是所有數異或後不為0 必敗態的話異或之後為0 必勝態可以轉換成必敗態。即從a i 中選擇乙個數是他變成其他所有a i 數的異或和。這樣最終異或值為0,使得對手陷入必敗態。相關知識可以檢視 include include include include using name...

取石子遊戲之尼姆博弈

尼姆博弈 有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝 這種情況與二進位制有著很大的關係,我們用 a,b,c 來表示某種局勢,那麼 0,0,0 必然為奇異局勢,最後乙個面對這個局勢的必敗。0,n,n 也是種奇異局勢。因為如果對手在其中一堆取m個石...