HDU 1527取石子遊戲

2022-08-12 02:57:17 字數 1026 閱讀 9168

必敗態和勝態有著如下性質:

1、若面臨末狀態者為獲勝則末狀態為勝態否則末狀態為必敗態。

2、乙個局面是勝態的充要條件是該局面進行某種決策後會成為必敗態。

3、乙個局面是必敗態的充要條件是該局面無論進行何種決策均會成為勝態。

有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在兩堆中同時取走相同數量的石子。最後把石子全部取完者為勝者。

接下來就是尋找本題的必敗態了,首先顯然(0,0)就是乙個,接著不急尋找下乙個必敗態,因為這個必敗態可以延伸出其他的必勝態來,首先,(0,n)也是必勝態,(n,0),(n,n)都是必勝態,接下來就是(1,2),先手不管怎麼取,後手都贏。同理,衍生出(1,n),(n,2),(n+1,n+2)等必勝態,然後(2,1)根據對稱也是一樣的。(ps:上述必勝態不夠專業,因為如果不採取有效的方案,依然是必敗態,但是題目已給定雙方會採取最有效的方案,所以先手達到必勝態時,只需取走相應石子,就能給後手造成必敗態的局勢。)

接下來的必敗態分別為(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。

可以看出a0=b0=0,ak是未在前面出現過的最小自然數,而 bk= ak + k。

我們可以看出一下規律:

ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...n 方括號表示取整函式)

其中(1+√5)/2是**分割數。

#include"

stdio.h

"#include

"stdlib.h

"#include

"math.h

"int

main()

t=b-a;

ak=(int)(t*k);

//printf("%d ",ak);

if(a==ak)

printf(

"0\n");

else

printf(

"1\n");

}}

HDU 1527 取石子遊戲

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

HDU 1527 取石子遊戲

time limit 1000ms memory limit 32768kb 64bit io format i64d i64u description 有兩堆石子,數量任意,可以不同。遊戲開始由兩個人輪流取石子。遊戲規定,每次有兩種不同的取法,一是可以在任意的一堆中取走任意多的石子 二是可以在兩堆...

HDU 1527 取石子遊戲

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