博弈问题除了有趣之外,我也想不到有什么可以形容了,知识有用之余,又可以骗下那些无知的小朋友(奸笑ing…………)
这个又是经典的说,叫做巴什博弈,英文叫Bash Game。嗯嗯,大概又是一个叫Bash的人想到的
所谓的Bash Game就是说:在只有一堆n个的物品,两人轮流从中取物品,每次至少取一个,至多取m个,最后是谁取光物品谁就是胜利者。
先假设,n = m+1.很明显无论当前玩家从中取多少物品,都无法否认他将要输的命运,这是一个必败点。我们的目的总是为了导致必败点,
假设 m+1 < n < 2(m+1),那么当前玩家只要从中取(n-(m+1))就可以导致必败点(m+1);又假设2(m+1) < n < 3(m+1),当前玩家只要从堆中取出
(n-2(m+1))的物品,堆中剩下2(m+1)的物品,无论对手接下来取多少物品(1 <= x <= m),剩下的物品数s,m+1 < s < 2(m+1),我们又可以取走相应数
量的物品使堆中剩下m+1 个物品,所以2(m+1)也是一个必败点;如此类推堆中物品数 S = k(m+1)(k = 1,2,3……)为必败点。
最后得出在这个游戏中:
1.如果m >= n,先手者必胜
2.如果n = k(m+1)+x (k = 1,2,3……;x <= m),先手者胜
3.如果n = k(m+1),后手者胜
然后…………………………你懂的
#include<iostream> using namespace std; int main() { int cCase; cin >>cCase; while(cCase--){ int n,m; bool flag = true; cin >>n >>m; if(m >= n) flag = true; else if(n%(m+1)) flag = true; else flag = false; if(flag) cout <<"first" <<endl; else cout <<"second" <<endl; } return 0; }