BZOJ 3895 取石子 SG函式 搜尋

2022-04-06 20:18:01 字數 743 閱讀 8565

有n堆石子

·從某堆石子中取走乙個

·合併任意兩堆石子

不能操作的人輸。

100%的資料滿足t<=100,  n<=50. ai<=1000

容易發現基礎運算元$d=\sum a_i +n-1$

沒有個數為1的堆還好說,有的話@#$%^&好麻煩啊啊啊啊啊怎麼可能找規律

然後看題解,woc記憶化搜尋

$f(i,j)$表示i個個數為1的堆,其他運算元為j的勝負態

列舉操作轉移就行了,一定要列舉對!注意$j=1$時

#include #include 

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=51,m=50055

;inline

intread()

while(c>='

0'&&c<='9')

return x*f;

}int

n,f[n][m];

int dfs(int a,int

b)int

main()

if(y) y--;

puts(dfs(x,y) ? "

yes" : "no"

); }

}

BZOJ3895 取石子(博弈 記搜)

傳送門 我們可以通過石子的堆數和每一堆的個數計算出剩餘的運算元,顯然運算元為奇先手必勝,為偶先手必敗。若將 1的石子堆單獨考慮,對於若干堆 1的石子,運算元為 n i 1x i 那麼我們可以記f a b 表示有a堆 1的石子,1的石子運算元為b的狀態 1表示先手必勝,0表示先手必敗 然後進行記搜,對...

bzoj 3895 取石子(博弈 記憶化搜尋)

time limit 1 sec memory limit 512 mb submit 267 solved 130 submit status discuss alice和bob兩個好朋含友又開始玩取石子了。遊戲開始時,有n堆石子 排成一排,然後他們輪流操作 alice先手 每次操作時從下面的規則...

bzoj3895 取石子(博弈論,記憶化搜尋)

time limit 1 sec memory limit 512 mb submit 361 solved 177 submit status discuss alice和bob兩個好朋含友又開始玩取石子了。遊戲開始時,有n堆石子 排成一排,然後他們輪流操作 alice先手 每次操作時從下面的規則...