甲,乙兩個人玩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
a1xor
a2x
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=a1x
ora2
xor
a3x
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
aixor
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堆石子的數量,他想知道是否存在先手必勝的策略。輸...