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

2022-07-24 20:24:11 字數 960 閱讀 5636

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

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

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

2

45 45

33 6 9

55 7 8 9 10

0

no

yes9 5

yes8 1

9 010 3

多堆石子,每次可以取任意值,問能否勝利?勝利的話輸出勝利的取法

標準的nim博弈的問題,詳情分析:

至於輸出取法,當最終得到的異或值 異或 每堆個數時,且小於每堆個數時,即為一種取法。

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const double pi = acos(-1.0);

const double eps = 1e-6;

const int inf = 0x3f3f3f3f;

const int maxn = 2e5+10;

int a[maxn];

int main()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個的中那一堆...

HDU2176取 m堆 石子遊戲

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