POJ 3922 A simple stone game(K倍減法遊戲)

題意:兩人取一堆石子,石子有n個。 先手第一次不能全部取完但是至少取一個。之後每人取的個數不能超過另一個人上一次取的數的K倍。拿到最後一顆石子的贏。先手是否有必勝策略?若有,先手第一步最少取幾個?
思路:
(1)首先k=1的時候,必敗態是2^i,因爲我們把數二進制分解後,拿掉二進制的最後一個1,那麼對方必然不能拿走倒數第二位的1,因爲他不能拿的比你多。你只要按照這個策略對方一直都不可能拿完。所以你就會贏。
(2)k=2的時候,必敗態是斐波那契數列。因爲任何一個整數n都可以寫成若干項不相鄰的斐波那契數的和,所以我們拿掉1,對方永遠取不完再高位的1。因爲斐波那契數列兩項f[i]和f[i+2]滿足f[i+2]>2*f[i]。比如設斐波那契數列爲1,2,3,5,8,13……12=8+3+1,化成二進制就好比是10101,那麼你拿走最右邊的1(其實就是1),那麼對方不可能拿走第三位的1(這個1其實是3),這樣就和 k=1一個道理,對方不可能拿完,所以你就能拿完;
(3)k>=3的時候,我們必須構造數列,將n寫成數列中一些項的和,使得這些被取到的項的相鄰兩個倍數差距>k 那麼每次去掉最後一個1 還是符合上面的條件。設這個數列已經被構造了i 項,第i項爲a[i],前i項可以完美對1到b[i] 編碼使得每個編碼的任意兩項倍數>K 那麼有a[i+1]=b[i]+1;這是顯然的。因爲b[i]+1沒法構造出來。只能新建一項表示。然後計算b[i+1]。 既然要使用 a[i+1] 那麼下一項最多隻能是某個a[t] 使得 a[t]*K

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章