洛谷 nim遊戲 模板nim博弈論

2021-10-07 15:06:43 字數 1850 閱讀 5138

題目傳送

題意:

模板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...