題目傳送
題意:
模板nim博弈論。
思路:所有數的異或和如果為0,那麼先手必輸,否則先手必贏。
證明:
1.首先很明顯的乙個必輸態為:全部石子都為0,那麼先手直接輸(此時異或和為0)
2.那麼當異或和不為0的時候,我們假設現在的異或和為k,那麼現在k的最高位的1的位置,一定對應於現在的石子堆中的一堆石子的最高位(因為,這個位置沒有乙個1,那麼異或和為什麼會有1)
3.現在證明了,一定有一堆石子的最高位的1和k的最高位1相對應,那麼我們現在假設這堆石子的數量為m,其他推石子的異或和為a,總共的異或和為k,那麼現在有等式: m ^ a = k,m ^ k = a
4.有了這幾個等式後:
(1)我們先手把那堆數量為m的石子拿成m ^ k,那麼也就是拿成還剩a個
(2)那麼後手將面對目前的異或和為0(a ^ a = 0,也就是其他堆石子的異或和與還剩的a異或),而目前的後手面對異或和為0,他無論怎麼拿,也不可能將異或和再次變成0,那麼下一次的先手將又可以拿成異或和為0
(3)那麼得出結論如果有一方目前的情況為異或和不為0,那麼他就一直可以把目前的異或和拿成0,那麼後手就會一直面對異或和為0的情況(直到石子全為0,就輸了,因為先手必然不可能拿到異或和為0)
ac**
#include
inline
long
long
read()
while
(c >=
'0'&& c <=
'9')
return x*s;
}using
namespace std;
#define newnode (treenode *)malloc(sizeof(treenode))
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x)&(-x)
const
int n =
2e5+10;
const
long
long infinf =
0x7f7f7f7f7f7f7f
;const
int inf =
0x3f3f3f3f
;const
double eps =
1e-7
;const
double eee =
exp(1)
;const
int mod =
1e9+7;
const
double ii =
acos(-
1);const
double pp =
(ii*
1.0)/(
180.00);
typedef
long
long ll;
typedef
unsigned
long
long ull;
typedef pair<
int,
int> pii;
typedef pair piil;
signed
main()
ans ==
0? cout <<
"no"
<< endl : cout <<
"yes"
<< endl;
}}
博弈論 Nim遊戲
這種遊戲稱為nim博弈,遊戲過程中面臨的狀態成為局面。n im nimni m博弈不存在平局,只有先手必勝和先手必敗兩種情況。定理nim 博弈先手 必勝,當 且僅當a 1xora2 xor xoran 0nim博弈先手必勝,當且僅當 a 1 texta 2 text cdots text a n n...
洛谷P2197 模板 nim遊戲 博弈論
甲,乙兩個人玩nim取石子遊戲。nim遊戲的規則是這樣的 地上有n堆石子,每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。n im nimni m博弈的模板。定理...
洛谷P2197 模板 nim遊戲 博弈論
甲,乙兩個人玩nim取石子遊戲。nim遊戲的規則是這樣的 地上有n堆石子,每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。ni mnim 博弈的模板。定理 nim...