problem descriptionalice 和 bob 總喜歡聚在一起玩遊戲(t_t),今天他(她)們玩的是一款新型的取石子遊戲。遊戲一開始有n堆石子,alice 和 bob 輪流取出石子。在每次操作中,遊戲者必須選擇其中的一堆石子,並作出下列的其中一種操作:
(1)移去整堆石子
(2)假設石子堆中有x顆石子,取出y顆石子,其中
1<=yinput
第一行包含乙個整數t,表示測試資料的組數。接下來t組測試資料,在每組資料中,第一行包含乙個整數n,表示有多少堆石子。第二行n個正整數,分別表示每堆有多少顆石子。
100%的資料,t<=100,
n<=100
,每堆石子數量不大於1000000
output
每組測試資料輸出一行,表示獲勝者的名字(alice 或者 bob)。
sample input
333 5 6
42 3 6 9
53 2 1 1000000 999999
sample output
alicebobalice
題目意思相當於是有 n 堆石子,每次取與某一堆當前石子數互質的石子個數或全取完。取掉最後一顆石子的人獲勝。
這種博弈題一般用sg函式做,寫寫畫畫發現,sg(x)=rank(d),其中d為x的最小質因子,rank(d)表示d在質數表中的排名+1,之後把每一堆初始石子個數的sg值異或一下,答案判斷是否為零就行了。
用了一下線性篩來篩質數,這樣順便就求出了每個sg函式值。(每個數隻會被篩到一次)
#include int p[1000010],f[1000010],sg[1000010],num,n,ans,k,t;
void get_p()
}int main()
}
取石子遊戲與SG函式
題目 題意 有3堆石子,石子數量分別為a,b,c,有兩個玩家,每次只能從任意一堆中取f個,這裡的f只能為fibnacci數,問是先手 勝 還是先手敗.分析 由於石子的數量都在1000以內,那麼我們可以先預處理出1000以內的sg函式值,然後對於3堆石子,我們進行異或,如果為 0說明先手必敗,否則必勝...
SG 分石子遊戲
時間限制 2000 ms 記憶體限制 65535 kb 難度 6 描述 閒來無事,zyc發明了一種遊戲,叫分石子遊戲,初始有d堆石子,每堆石子的數量已知。兩個人輪流分石子,可以選取這d堆石子中的任意一堆,然後把選中的這堆石子分成m堆 每堆石子數量都必須大於0 現在石子的堆數將變成d m 1堆,對方就...
取石子(sg函式)
alice和bob有n桶石子,裡面有ai個,他們每次只能其中一某堆裡取奇數個,不能拿的人輸,alice總是先拿 1 n 200,1 ai 1e9 input 第一行為 n 第二行為 n個數 ai output 最後獲勝的人alice或bob sample input 33 2 1 sample ou...