HDOJ2177 取 2堆 石子遊戲

2021-04-25 02:14:05 字數 1541 閱讀 2222

有兩堆各若干個物品,兩個人輪流從某一堆或同時從兩堆中取同樣多的物品,規定每次至少取乙個,多者不限,最後取光者得勝。相關的經典例題:

這種情況下是頗為複雜的。我們用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示兩堆物品的數量並稱其為局勢,如果甲面對(0,0),那麼甲已經輸了,這種局勢我們稱為奇異局勢。前幾個奇異局勢是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

假設面對的局勢是(

a,b),若

b = a

,則同時從兩堆中取走

a 個物體,就變為了奇異局勢(0,

0);如果

a = ak

,b > bk

,那麼,取走

b- bk

個物體,即變為奇異局勢;如果

a = ak

,b < bk ,

則同時從兩堆中拿走

ak - ab - ak

個物體,

變為奇異局勢(

ab - ak , ab - ak+ b - ak

);如果

a > ak

,b= ak + k,

則從第一堆中拿走多餘的數量

a - ak

即可;如果

a < ak

,b= ak + k,

分兩種情況,第一種,

a=aj

(j < k),

從第二堆裡面拿走

b - bj

即可;第二種,

a=bj

(j < k),

從第二堆裡面拿走

b - aj

即可。

從如上性質可知,兩個人如果都採用正確操作,那麼面對非奇異局勢,先拿者必勝;反之,則後拿者取勝。

那麼任給乙個局勢(a,

b),怎樣判斷它是不是奇異局勢呢?我們有如下公式:

ak =[k(1+

√5)/2]

,bk= ak + k

(k=0,1

,2,...,n

方括號表示取整函式)

奇妙的是其中出現了**分割數(1+√

5)/2 = 1

。618...,因此,

由ak,bk

組成的矩形近似為**矩形,由於2/(

1+√5)

=(√5-1)

/2,可以先求出

j=[a

(√5-1

)/2]

,若a=[j(1+

√5)/2]

,那麼a = aj

,bj = aj + j

,若不等於,那麼

a = aj+1

,bj+1 = aj+1+ j + 1

,若都不是,那麼就不是奇異局勢。然後再按照上述法則進行,一定會遇到奇異局勢。

所以只要

if(m == (int)(t*(1 + d) / 2)) printf("0/n"); 就ok

了。

hdu 2177 取 2堆 石子遊戲

威佐夫博弈變異,要求輸出能贏的售後第一次能取得情況。3.一定存在規則允許的某種操作可將必勝點移動到必敗點 證明 以某個必勝點 i,j 為例。因為所有自然數都會出現在某個必敗點中,故要麼i等於m k 要麼j等於n k 若i m k j n k 可從j中取走j n k 個石子到達必敗點 若i m k j...

hdu 2177 取 2堆 石子遊戲

天資愚笨啊,網上的一大堆沒看懂。總結百科的方法為 1.a b 同時減去a 得到0,0 2.a a k b b k b b b k 3.a a k b同時拿走a k a b a k 得到 a b a k a b a k b a k 4.a a k b b k 從a中拿走 a a k 5.a5.1 a ...

HDU 2177 取 2堆 石子遊戲

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。現在給出初始的兩堆石子的數目,如果輪到你先取,假設雙方都採取最好的策略,問最後你是勝者還是敗者。如果...