2009年12月23日 星期三

ZOJ 3282 Go Downstairs

ZOJ 12月月賽題目。

給出每行有及僅有一個梯級,有或沒有金幣,幣值。每一行的梯級必然在上一行的梯級的左方或右方。一個在這張圖上的遊戲是這樣的﹕首玩者可以以費用選擇移去該行的梯級,麼次玩者會垂直掉到最接近的梯級,或離開地圖。如果該梯級有金幣的話也一併移掉。次玩者可以選擇修復剛移除的梯級(最多只能操作次),但不能修復原有的金幣。每當他走到有金幣的話他必定會取走。次玩者必然從最頂層出發。首玩者先操作。當次玩者跳離地圖,遊戲便結束。

問,若果金幣全屬首玩家所有,那麼在雙方採取最優策略底下,首玩家的損失最小是甚麼。

首先,不難留意這張圖可以化為有向無環圖。頂層梯級為出發點,並構造虛擬終點(即跳離地圖的狀態)。然後可以結論這道題目是Minimax題。簡單的動態規劃可以搞定。狀態為,當中是行數、是用了多少次修復,為玩者編號。轉移方程也很一般,不贅述。

此題唯一比較不足的地方是,應該容許兩層梯級可以共處同一垂直位置,而且應該考慮同一梯級可以重覆修復及移除。但是題目實際上如果移除了,某人就必須走下一級。這樣,下列的情況會得出不一樣的答案﹕

5 5 5 1 2
G....
G....
G....
G....
G....

(注意根據原題描述,此情況絕不會發生)

2009年9月28日 星期一

Lucas Theorem

讀過組合或概率的朋友都知道從種互不相同的東西取種,有種不同的組合,或記作。此式可以寫成以下形式﹕

如果給出一個質數,問的餘數是多少?


1878年Lucas提出以下定理﹕

當中


就是把寫成進制,然後每一個位的對應系數求相同問題,再取積則成。
把這個問題的轉化有一個好處,就是當非常大的時候,而相對地小,利用Lucas定理運算同樣問題會快很多。剩下的問題就是求的餘數是多少。把此式展開,

根據模運算,可以計算每分數除的餘數,然後取積除的餘數即可。
問題是,模運算對的餘數不能直接用分子分母的方法取得。其中一個方法是用擴張輾轉相除法,另一個方法比較巧妙。因為是質數,根據費馬小定理,若互質,可得以下公式﹕

利用模運算,可得﹕


當中
的餘數直接等價於求的餘數。求可以利上式以時間求出。
由於 ,此問題可以在時間內求出。

延伸﹕因為對於任何系數,都必然小於。所以當為質數,費馬小定理必然成立。如果當呢?我們可以直接取其餘數,再套入費馬小定理即可。注意當餘數等於表示不存在。