NIM 乙個NP問題的簡解

2021-06-27 22:47:00 字數 1382 閱讀 3161

題目大意:在n

顆石子中,第一次可取1到

n-1顆,之後每次取的不超過上一次取的石子數。取完的獲勝。

給出結論:當n為2

的k次方時,是必敗局面,否則先手必勝。(

k>=1)

證明:首先,考慮n

為奇數時,每次取

1,對手下一次也只能取

1,必勝。

否則n即為偶數,是2的

k1倍。

當k1為奇數時,是必勝策略,因為每次取

2,最終由先手取完,要是其中某次後手不取2,取

1,便轉移到奇數的局面,還是先手勝利。

所以2的奇數倍是必勝態。

剩下2的偶數倍,是4的

k2倍。

同理,當k1

為奇數時,同樣是必勝策略。奇數不能取,取

2的話,剩下的為

2的奇數倍,是必勝態。

再考慮4,8,16……的偶數倍。

得到乙個類似數學歸納法證明的結論:當n為

2的1到

k次方的奇數倍都為必勝態時,則n為2的

k+1次方的奇數倍也為必勝態。

因為:當先手取2

的k+1

次方後,後手不取2的

k+1次方,就必定轉移到其他的必勝態(之前

2的某次方的奇數倍),或者一直取下去,也是先手取完。

當然,當n恰為2

的k次方時,一次是取不了2的

k次方的,所以只能轉移到之前的

2的某次方的奇數倍。

和hlq

大神討論了另外一種二進位制解法。與lowbit 

相關。

在二進位制下,先手取最後乙個1

就能夠獲勝。

取的是第k

位,之後的全部都會是0.

把取第k

位兩次,從0取為

1,再從1取回

0.看做乙個過程,無疑這個會導致前面的退位。

我們先考慮只取第k

位,暫時不取

k位之後的。

k位之前的部分代表的數,就是這個過程的倍數。每個過程都包括先手和後手都取一次。

當最後取完時,進行了若干次完整的過程。可以看做先手是先將1取成0

,之後先後手進行若干次過程(後手取為

1,先手再取回

0)。所以先手是必勝的。

假設後手不取第k

位,反而取後面乙個更小的位。

因為取的是最後乙個1

,所以後面都是

0,後手便把某一位

0取做了

1,先手只需再將最後一位1取做

0,便是和上面論述的一樣的問題。

因為2的n

次方,是只有第一位為

1的二進位制數,並且規則規定我們取不到那一位,所以先手只能取到乙個

0位,必敗。

由解乙個bug想到的

最近花費了很久時間去解決乙個bug,在我手裡有乙個月了。今天同事出手幫忙解決掉了,分外感激。這個bug如果按照我的思路,再過乙個月也不一定能夠解決掉。三人行,必有我師。同事身上有許多值得我學習的地方。比如,我是從程式碼執行機制方面找尋產生bug的原因,可是程式碼數量龐大。很難發現其中的某一處問題所在...

為什麼L0正則化是乙個NP難解問題?

矩陣的l0範數就是非0元素的個數,通常用它來表示稀疏,l0範數越小0元素越多,也就越稀疏。例如 a 1,2,3 4,6,6 的l0範數就是 6。當p 趨近於0的時候,這個函式就只有在x 0的時候 等於0,其他的位置都為1!也就是說,l0 norm可以用於表達乙個向量 矩陣的稀疏性!這個公式與l2 n...

乙個python小白的問題 求哥哥姐姐們解答

題目是 練習 成績等級劃分,錄入學生成績,輸出對應的等級,等級如下 90 a 80 b 70 c 60 d 其他 e grade int input 輸入學生的成績 if grade 90 print a elif grade 80 print b elif grade 70 print c eli...