取石子遊戲

2021-10-04 04:14:12 字數 1384 閱讀 1495

(這是一道遲到的取石子遊戲題解,不小心把他落單啦!)

原題來自:beijing 2009 wc(這個比賽難道是廁所?)

小 h 和小 z 正在玩乙個取石子遊戲。取石子遊戲的規則是這樣的,每個人每次可以從一堆石子中取出若干個石

子,每次取石子的個數有限制,誰不能取石子時就會輸掉遊戲。小 h 先進行操作,他想問你他是否有必勝策略,

如果有,第一步如何取石子。

第一行為石子的堆數 n。接下來 n 行,每行乙個數 ai ,表示每堆石子的個數,接下來一行為每次取石子個數的

種類數 m。接下來 m行,每行乙個數 bi,表示每次可以取的石子個數,輸入保證這 m 個數按照遞增順序排列。

第一行為 yes 或者 no,表示小 h 是否有必勝策略。若結果為 yes,則第二行包含兩個數,第乙個數表示從哪堆

石子取,第二個數表示取多少個石子,若有多種答案,取第乙個數最小的答案,若仍有多種答案,取第二個數最小的答案。

476

9321

2

yes

1 1

·樣例解釋

樣例中共有四堆石子,石子個數分別為 7,6,9,3每人每次可以從任何一堆石子中取出 1 個或者 2 個石子,小 h 有必勝策略,事實上只要從第一堆石子中取乙個石子即可。

·資料範圍與提示

對於全部資料,n≤10,ai≤1000,m≤10,bi≤10。

博弈論。

首先暴力算出1000以內的sg函式(肯定是10以內,因為最多10取石子的種方案),然後每一堆的sg函式xor起來得到最終的sg函式,若為0,就輸

若不為0,就贏,然後判斷

列舉每一種方案(按字典序列舉),然後計算sg:sg xor sg[a[i]] xor (sg[a[i]-k]))

還要注意一下,這個方案是否可取(在不在m種取石子的方案裡)

#includeusing namespace std;

int n,m,c[1100],a[110],b[110],ans;

bool cut[11];

void cnt()

} }}int main()

} }return 0;

}

取石子遊戲

如下 include include intmain k b a temp floor k 1.0 sqrt 5 2.0 if temp a printf 0 n else printf 1 n return 0 一 巴什博奕 bash game 只有一堆n個物品,兩個人輪流從這堆物品中取物,規定每...

取石子遊戲

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。in...

取石子遊戲

取石子遊戲 time limit 1000ms memory limit 10000k total submissions 25176 accepted 7961 description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆...