SG函數
首先定義mex(minimal excludant)運算,這是施加於一個集合的運算,表示最小的不屬於這個集合的非負整數。
例如mex{0,1,2,4}=3、mex{2,3,5}=0、mex{}=0。
【實例】取石子問題
有1堆n個的石子,每次只能取{ 1, 3, 4 }個石子,先取完石子者勝利,那么各個數的SG值為多少?
SG[0]=0,f[]={1,3,4},
x=1 時,可以取走1 - f{1}個石子,剩余{0}個,所以 SG[1] = mex{ SG[0] }= mex{0} = 1;
x=2 時,可以取走2 - f{1}個石子,剩余{1}個,所以 SG[2] = mex{ SG[1] }= mex{1} = 0;
x=3 時,可以取走3 - f{1,3}個石子,剩余{2,0}個,所以 SG[3] = mex{SG[2],SG[0]} = mex{0,0} =1;
x=4 時,可以取走4- f{1,3,4}個石子,剩余{3,1,0}個,所以 SG[4] = mex{SG[3],SG[1],SG[0]} = mex{1,1,0} = 2;
x=5 時,可以取走5 - f{1,3,4}個石子,剩余{4,2,1}個,所以SG[5] = mex{SG[4],SG[2],SG[1]} =mex{2,0,1} = 3;
以此類推.....
x 0 1 2 3 4 5 6 7 8....
SG[x] 0 1 0 1 2 3 2 0 1....
步驟:
1、預處理 f 數組(當前通過哪些操作后可得到的狀態)
2、使用另一個數組標記后繼狀態。
3、模擬 mex 運算,找最小值,賦給SG
4、重復2-3,完成過程。
fighting fighting fighting