hdu2176取(m堆)石子遊戲
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
2 45 45
3 3 6 9
5 5 7 8 9 10
0sample output
no yes
9 5
yes
8 1
9 0
10 3
s=0 s=s^m[i];將所有的石子數異或ifs==0先手失敗,else先手勝,而將結果與各個數目異或結果比原來的少,則可把原來數目取為異或結果
*#include < iostream >
#include < stdio.h >
using namespace std;
int s[200010];
int main()
if(sum==0)
cout<<」no」;
else
} }
return 0;
}
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個的中那一堆...
HDU 2176 取 m堆 石子遊戲(博弈)
思路 乙個經典的nim博弈 includeusing namespace std const int maxn 200000 50 int a maxn int main if sum 0 printf no n else printf yes n int res for int i 1 i n i...