洛谷P2197 模板 nim遊戲 博弈論

2021-09-25 03:13:51 字數 1585 閱讀 9905

甲,乙兩個人玩nim取石子遊戲。

nim遊戲的規則是這樣的:地上有n堆石子,每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。

n im

nimni

m博弈的模板。

定理:nim

nimni

m博弈中先手必勝,當且僅當a1x

ora2

xora

3xor

...x

oran

>

0a_1\ xor\ a_2\ xor\ a_3\ xor...xor\ a_n>0

a1​xor

a2​x

ora3

​xor

...x

oran

​>0。

設n=a

1xor

a2xo

ra3x

or..

.xor

an

n=a_1\ xor\ a_2\ xor\ a_3\ xor...xor\ a_n

n=a1​x

ora2

​xor

a3​x

or..

.xor

an​因為ax≥

0a_x\geq0

ax​≥

0,所以顯然n≥0

n\geq0

n≥0首先,當所有石子全部被取完時,顯然有n=0

n=0n=

0。此時先手處於必敗態

如果n

>

0n>0

n>

0,那麼設n

nn二進位制下從左往右數第一位為1的是第k

kk位,那麼必然有奇數堆石子的第k

kk位為1,設第i

ii堆石子的第k

kk位為1,那麼就從i

ii中取出若干石子,使得a

ia_i

ai​變為aix

or

na_i\ xor\ n

ai​xor

n(顯然aix

or

n

a_i\ xor\ nai

​xor

n​)。由於數量為奇數,那麼取完的必然是先手,此時有n=0

n=0n=

0。通過數學歸納法可得,n=0

n=0n=

0時先手為必敗態,n

>

0n>0

n>

0時先手為必勝態。

證明過程很粗略而不嚴謹,大概是這個意思好了:):)

:)

#include

using

namespace std;

int t,n,ans,x;

intmain()

if(!ans)

printf

("no\n");

else

printf

("yes\n");

}return0;

}

洛谷 P2197 模板 nim遊戲 解題報告

甲,乙兩個人玩nim取石子遊戲。nim遊戲的規則是這樣的 地上有n堆石子 每堆石子數量小於10000 每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。第一行乙個整...

洛谷P2197 模板 nim遊戲 博弈論

甲,乙兩個人玩nim取石子遊戲。nim遊戲的規則是這樣的 地上有n堆石子,每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。ni mnim 博弈的模板。定理 nim...

洛谷 2197 模板 nim遊戲

題目描述 甲,乙兩個人玩nim取石子遊戲。nim遊戲的規則是這樣的 地上有n堆石子 每堆石子數量小於10000 每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。輸...