HDU 2177 取 2堆 石子遊戲

2021-07-30 22:28:55 字數 1385 閱讀 3275

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

input

輸入包含若干行,表示若干種石子的初始情況,其中每一行包含兩個非負整數a和b,表示兩堆石子的數目,a和b都不大於1,000,000,且a<=b。a=b=0退出。

output

輸出也有若干行,如果最後你是敗者,則為0,反之,輸出1,並輸出使你勝的你第1次取石子後剩下的兩堆石子的數量x,y,x<=y。如果在任意的一堆中取走石子能勝同時在兩堆中同時取走相同數量的石子也能勝,先輸出取走相同數量的石子的情況.

sample input

1 2

5 8

4 7

2 2

0 0sample output

0 1

4 7

3 5

0 1

0 0

1 2分析:這道題是威佐夫博弈

可將兩堆物品記做(a,b) 只考慮a<=b;

1.(0,0)p點

2.(0,*)n點(一步到1)

3.(1,1)n點

4.(1,2)p點(只能到2,3)

5.(1,*)n點(一步到4)

6.(2,*)n點

7.(3,3)n點(一步到1)

8.(3,4)n點(一步到4)

9.(3,5)p點(到不了p點)

10.(3,*)n點(一步到9)

11.(5,*)n點

. .

. 所以,p點在 i=b-a(i=0,1,2,3…) 的位置

1.ai=[i*(1+√5)/2](方括表示下取整),2.bi=ai+i

如果開始時a,b就滿足上述關係則先手敗,否則先手勝。勝的時候還要輸出第一次取子之後剩下的棋子x,y。只取一堆的情況

1.取a,則b不變,a滿足 ai=[i*(1+√5)/2]&&a=b-i,即可

2.取b,則a不變,a<=b時 ai=[i*(1+√5)/2]&&a=b-i

b<a時 bi=[i*(1+√5)/2]&&b=a-i

取兩堆的情況 b-a=i 不變

所以只要取成 a=[(b-a)*(1+√5)/2],即可製造必敗點

#include

using

namespace

std;

int main()

}for(int i=a;i>=0;i--)

for(int i=b;i>a;i--)

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 ...

取 2堆 石子遊戲 hdu2177

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