尼姆博弈 (附 HDU1850)

2021-07-24 10:03:54 字數 3452 閱讀 3778

尼姆博弈:

三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。

這種情況與二進位制有著很大的關係,

我們用(a,b,c)來表示某種局勢,

那麼(0,0,0)

必然為奇異局勢,

(0,n,n)

也是種奇異局勢

。因為如果對手在其中一堆取m個石子(m<=n),那麼你也可以在另外一堆中取m個,他取幾個你就取幾個,到最後有一堆變為0的時候,你再取完另一堆勝利(滿滿的套路=。=)。

直接說結論吧:

對於任意的奇異局勢

(a,b,c)

,都有a^b^c=0。(^

為異或運算)。

對於任意的非奇異局勢(a,b,c),假設a

原理:因為a^a=0,

所以a^b^c=a^b^(a^b)=0,

所以只需將c-(a^b)即可。

來來來,這裡有個栗子,還熱乎乎的呢=w=:

有個非奇異局勢(14,21,39),

因為14^21=27,39-27=12,所以從39中拿走12個物體即可達到奇異局勢(14,21,27)。

這裡還有個栗子,買一贈一哦=w=

:我們來實際進行一盤比賽看看:

甲:(7,8,9)->(1,8,9)奇異局勢

乙:(1,8,9)->(1,8,4)

甲:(1,8,4)->(1,5,4)奇異局勢

乙:(1,5,4)->(1,4,4)

甲:(1,4,4)->(0,4,4)奇異局勢

乙:(0,4,4)->(0,4,2)

甲:(0.4,2)->(0,2,2)奇異局勢

乙:(0,2,2)->(0,2,1)

甲:(0,2,1)->(0,1,1)奇異局勢

乙:(0,1,1)->(0,1,0)

甲:(0,1,0)->(0,0,0)奇異局勢

甲勝。

於是,我們又發現了一些神奇而顯然的性質=w=:

性質1:對於某個局面(a1,a2,...,an),

若a1^a2^...^an!=0,

一定存在某個合法的移動,將ai改變成ai'後滿足a1^a2^...^ai'^...^an=0。

分析:令res=a1^a2^......an,設res的最高位為pos(那pos的數肯定為1啦),

那麼一定存在某個ai,它的二進位制在pos位上也是1,(否則k的最高位那個1是怎麼得到的)。

異或res

後這位變為0,

這時ai^res

一定成立。

則我們可以將ai改變成ai'=ai^res,此時a1^a2^...^ai'^...^an=a1^a2^...^an^res=0。

注意:雖然它一定存在合法的移動(一定有a[i]使ai^res

一定成立)使之變成奇異局勢,

但並不是每一堆都可以進行操作的,只有當a[i]>a[i]^res 的時候才可以對這一堆進行操作

拓展:任給n

堆石子,

兩人輪流從任一堆中任取

(每次只能取自一堆

),取最後一顆石子的人獲勝,問先取的人如何獲勝?

根據上面所述,

n個數異或即可。

如果開始的時候t=

0,那麼先取者必敗

如果開始的時候

t>0

,那麼只要每次取出石子使得t=

0,即先取者有獲勝的方法。

性質2:對於某個局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某個合法的移動,將ai改變成ai'後仍滿足a1^a2^...^ai'^...^an=0。

獲勝情況對先取者進行討論:

異或結果為

0,先取者必敗,無獲勝方法。後取者獲勝;

結果不為

0,先取者有獲勝的取法。

hdu1850

判斷先手能否贏,可以贏的話輸出第一步的方案數

var

n,t :longint;

i :longint;

a :array[0..110] of longint;

function work(t:longint):longint;

var j:longint;

ans:longint;

begin

ans:=0;

for j:=1 to n do

if (a[j]>a[j] xor t) then inc(ans);//判斷能否對當前堆進行操作

exit(ans);

end;

begin

read(n);

while (n<>0) do

begin

t:=0;

for i:=1 to n do

begin

read(a[i]);

t:=t xor a[i];

end;

if t=0 then writeln(0) else writeln(work(t));

read(n);

end;

end.

綜合巴什博弈、尼姆博弈給出】任給

n堆石子

,兩人輪流從任一堆中任取

(每次只能取自一堆

),規定每方每次最多取k顆

,取最後一顆石子的一方獲勝

.問先取的人如何獲勝?

與上面的問題比,這個更複雜一些,我們可以這樣做:

令bi=ai mod(k+1)定義t

『=b1 xor b2 xor ... xor bn如果t

『=0

那麼沒有獲勝可能,先取者必敗如果

t』>0

那麼必然存在取的方法,使得t『=

0,先取者有獲勝的方法

假設對方取了在

ai中取了

r(r<=k)個如果

ai中剩下的石子多於

k 那麼就在

ai中取走

k+1-r

個,則bi

不變,t『不變

如果ai<=k

那麼我們需要重新計算bi和

t『按照上面的方法來做就可以了

尼姆博弈 hdu 1850

nim博弈 題意 有m堆牌,兩個人先後取某堆中的任意 不少於一 張牌,最後取完者勝 問先手取勝第一次取牌有多少種取法。思路 1 如若給出 的是必敗狀態 a1 a2 an 0,則先手不會有任何可能獲得勝利 2 若給出的是必勝狀態 a1 a2 an k,其中k不為零 那麼我們的目的是要把必勝狀態 轉化為...

HDU1850 尼姆博弈求可行方案數目

題型 尼姆博弈模型,大致上是這樣的 有3堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取1個,多者不限,最後取光者得勝。分析 1 首先自己想一下,就會發現只要最後剩兩堆物品一樣多 不為零 第三堆為零,那面對這種局勢的一方就必敗 那我們用 a,b,c 表示某種局勢,首先 0,0,0 顯...

博弈 尼姆博弈

今天我們來聊一聊另一種博弈 尼姆博弈,這一種博弈可以說是巴什博弈的一種變體,巴什博弈中 石子 的堆數為1堆,而在利姆博弈中 石子 的堆數為n堆,還有在尼姆博弈中取石子的規則也發生了變化,前一種博弈中取石子的數量限定在 1,l 而後一種取石子的數量可以為任意數 但不能不取,而且還不能超過這一堆石子的總...