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

2022-02-13 15:10:27 字數 1764 閱讀 6685

題型

尼姆博弈模型,大致上是這樣的:

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

分析

1、首先自己想一下,就會發現只要最後剩兩堆物品一樣多(不為零),第三堆為零,那面對這種局勢的一方就必敗

那我們用(a,b,c)表示某種局勢,首先(0,0,0)顯然是必敗態,無論誰面對(0,0,0) ,都必然失敗;第二種必敗態是(0,n,n),自己在某一堆拿走k(k ≤ n)個物品,不論k為多少,對方只要在另一堆拿走k個物品,最後自己都將面臨(0,0,0)的局勢,必敗。仔細分析一下,(1,2,3)也是必敗態,無論自己如何拿,接下來對手都可以把局勢變為(0,n,n)的情形

那這種奇異局勢有什麼特點呢?

也不知誰這麼牛逼,竟然能把這種局勢和二進位制聯絡在一起

這裡說一種運算符號,異或'^',a^b=a'b+ab'(a'為非a)

我們用符號xor表示這種運算,這種運算和一般加法不同的一點是1 xor 1 = 0。先看(1,2,3)的按位模2加的結果:

1 = 二進位制01

2 = 二進位制10

3 = 二進位制11  xor

0 = 二進位制00 (注意不進製)

對於奇異局勢(0,n,n)也一樣,結果也是0

任何奇異局勢(a,b,c)都有a xor b xor c = 0

如果我們面對的是乙個非必敗態(a,b,c),要如何變為必敗態呢?

假設 a < b < c,我們只要將 c 變為a xor b,即可。因為有如下的運算結果:

a xor b xor (a xor b)=(a xor a) xor (b xor b) = 0 xor 0 = 0

要將c 變為a xor b,只要對 c進行 c-(a xor b)這樣的運算即可

problem description

一年在外 父母時刻牽掛

春節回家 你能做幾天好孩子嗎

寒假裡嘗試做做下面的事情吧

陪媽媽逛一次菜場

悄悄給爸爸買個小禮物

主動地 強烈地 要求洗一次碗

某一天早起 給爸媽用心地做回早餐

如果願意 你還可以和爸媽說

咱們玩個小遊戲吧 acm課上學的呢~

下面是乙個二人小遊戲:桌子上有m堆撲克牌;每堆牌的數量分別為ni(i=1…m);兩人輪流進行;每走一步可以任意選擇一堆並取走其中的任意張牌;桌子上的撲克全部取光,則遊戲結束;最後一次取牌的人為勝者。

現在我們不想研究到底先手為勝還是為負,我只想問大家:

——「先手的人如果想贏,第一步有幾種選擇呢?」

input

輸入資料報含多個測試用例,每個測試用例佔2行,首先一行包含乙個整數m(1output

如果先手的人能贏,請輸出他第一步可行的方案數,否則請輸出0,每個例項的輸出佔一行。

sample input

5 7 9

sample output

分析:由上分析可知,只要能對 c進行取走(c-(a xor b))這樣的操作即為可行方案

**如下:

#include#includeusing namespace std;

int main()

{ int n,p[111];

while(~scanf("%d",&n)&&n)

{int sum=0;

for(int i=0;i部分**:

尼姆博弈 hdu 1850

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

尼姆博弈 (附 HDU1850)

尼姆博弈 有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。這種情況與二進位制有著很大的關係,我們用 a,b,c 來表示某種局勢,那麼 0,0,0 必然為奇異局勢,0,n,n 也是種奇異局勢 因為如果對手在其中一堆取m個石子 m n 那麼你也可以在另...

hdu1730尼姆博弈

我猜中了開頭,卻沒有猜中結局 after several days 來編輯結局了 在一行棋子中,一旦兩個棋子挨著,先手必輸 先手走幾個對方走幾個,緊挨著,一定會被逼到邊緣 所以兩個棋子挨著就代表這一行已定局 石子數為0 所以就可以將兩個棋子之間的距離當作石子數,引申為尼姆博弈進行異或 注意距離要 1...