佛山市選2015 石子遊戲

2021-08-18 16:16:34 字數 1498 閱讀 4834

alice 和 bob 總喜歡聚在一起玩遊戲(t_t),今天他(她)們玩的是一款新型的取石子遊戲。遊戲一開始有n堆石子,alice 和 bob 輪流取出石子。在每次操作中,遊戲者必須選擇其中的一堆石子,並作出下列的其中一種操作:
(1)移去整堆石子

(2)假設石子堆中有x顆石子,取出y顆石子,其中1<=y

遊戲結束的條件是:取出最後一顆石子的人勝出。眾所周知,alice和bob都是絕頂聰明的,假設他們在遊戲中都採取最優的策略,問最後誰會勝出遊戲呢?

alice先取。

第一行包含乙個整數t,表示測試資料的組數。

接下來t組測試資料,在每組資料中,第一行包含乙個整數n,表示有多少堆石子。第二行n個正整數,分別表示每堆有多少顆石子。

每組測試資料輸出一行,表示獲勝者的名字(alice 或者 bob)。
3

3 3 5 6

4 2 3 6 9

5 3 2 1 1000000 999999

alice

bob

alice

20%的資料,n<=5,每堆石子數量少於10

100%的資料,t<=100,n<=100,每堆石子數量不大於1,000,000

考慮構造 sg 函式。

sgi = mex ( ( i, j )=1 ∪ )

其中 mex 表示集合中最小沒有出現過的自然數。

具體為什麼 sg 函式是這樣子的,大致上和經典取石子遊戲的思路相同。

那麼這個 sg 函式如果暴力算的話,貌似是 o( c^2logc ) 的,其中 c 表示石子數。

分析一下 sg 函式值的特點。

首先 sg0 = 0 (終止態)

若 k 與 i 互質,i 總是可以從 i­k 中轉移過來,又有若 k 與 i 互質,i­k 與 i 必定互質。

那麼綜上有 sgi = mex ( ( i, j )=1 ∪ )

若 i 是質數,那麼對於小於 i 的所有正整數都可以被取到,那麼 sgi則應為之前出現

過的所有 sg 值中最大者+1,我們不難發現質數們的 sg 值是遞增的。

若 i 是乙個合數,那麼 i 肯定存在某個因子為前面出現過的質數,於是 sgi 最多為該

質因子的 sg 值。又有質數們的 sg 值是遞增的,那麼 sgi 就應為最小質因子的 sg 值了。

我們發現合數必定不能產生新的 sg 值,它必定為其某個質因子的 sg 值。

於是第 k 個質數的 sg 值就是 k+1 了。

類似線性篩質數的原理,我們可以線性篩出 sg 值了。

#include

int p[1000010],f[1000010],sg[1000010],num,n,ass,t;

void get()

}int main()

printf(ass?"alice\n":"bob\n");

}}

JZOJ 4025 佛山市選2015 找回密碼

單擊檢視題目 建出字尾自動機後統計從每個點開始走能構成的字串總數 dfs一遍 之後直接找就行了 當然,正解其實是打表 include include include include define fo a,b,c for a b a c a define fd a,b,c for a b a c a...

佛山市選2013 回文子串行

description 回文序列是指左右對稱的序列。例如1 2 3 2 1是回文序列,但是1 2 3 2 2就不是。我們會給定乙個n m的矩陣,你需要從這個矩陣中找出乙個p p的子矩陣,使得這個子矩陣的每一列和每一行都是回文序列。input 第一行有兩個正整數n,m。接下來是n行,代表乙個n m的矩...

佛山市選2013 海明距離

description 對於二進位制串a,b,他們之間的海明距離是指兩個串異或之後串中1的個數。異或的規則為 0 xor 0 0 1 xor 0 1 0 xor 1 1 1 xor 1 0 計算兩個串之間的海明距離的時候,他們的長度必須相同。現在我們給出n個不同的二進位制串,請計算出這些串兩兩之間的...